对象的初始化
常见的编程习惯是类中所有的初始化方法都以init开头。
如果希望在类对象初始化时做一些事情。可以通过覆写init方法达到这个目的。
-(id)init
{
self = [super init];
if (self) {
//初始化代码
}
return self;
}
必须将父类init方法的执行结果赋值给self,因为初始化过程改变了对象在内存中的位置(意味着引用将要改变)。如果父类的初始化过程成功,返回的值是非空的,通过if语句可以验证,注释说明可以在这个代码块的位置放入自定义的初始化代码。通常可以在这个位置创建并初始化实例变量。
注意,init被定义为返回id类型,这是编写可能会被继承的类init方法的一般规则。
程序开始执行时,它向所有的类发送initialize调用方法。如果存在一个类及相关的子类,则父类首先得到这条消息。该消息只向每个类发送一次,并且向该类发送其它任何消息之前,保证向其发送初始化消息。
作用域:
在接口中声明的实例变量可以通过子类进行继承。
可以把下面指令放在实例变量之前,以便更精确地控制其作用域:
1) @protected,可以被类及任何子类中定义的方法直接访问。在接口部分定义的实例变量默认是这种作用域。
2)@private,只能本类访问,不能被子类直接访问。在实现部分定义的实例变量默认属于这种作用域。
3)@public,可以被本类、其他类或者模块中定义的方法直接访问。
4)@package,对于64位映像,可以在实现该类的映像中的任何地方访问这个实例变量。
@public指令使得其他方法或函数可以通过使用指针运算符(->)访问实例变量。但,实例变量声明为public并不是良好的编程习惯,因为这违背了数据封装的思想(即一个类需要隐藏它的实例变量)。
关于属性、存储方法和实例变量:
编码规范(Xcode4已经采用的)目前的趋势是使用下划线(_)作为实例变量名的起始字符。
@synthesize window = _window;
表明合成(synthesize)属性window的取值方法和设置方法,并将属性与实例变量_window(实例变量并没有显性声明)关联起来。这对区别属性和实例变量的使用是有帮助的。
[window makeKeyAndVisible]; //错误
[_window makeKeyAndVisible];//正确
[self.window makeKeyAndVisible];//正确
全局变量:
在程序的开始处(所有的方法、类定义)编写一下语句:
int gMoveNumber = 0;
那么这个模块中的任何位置都可以引用这个变量的值。这种情况下,我们说gMoveNumber被定义为全局变量。
按照惯例,用小写的g作为全局变量的首字母。
外部变量是可被其他任何方法或函数访问和更改其值的变量。在需要访问外部变量的模块中,变量声明和普通方式一样,只是需要在声明前加上关键字extern。
使用外部变量时,必须遵循下面这条重要的原则:变量必须定义在源文件中的某个位置。即在所有的方法和函数之外声明变量,并且前面不加关键字extern,如:int gMoveNumber;
确定外部变量的第二种方式是在所有的函数之外声明变量,在声明前面加上关键字extern,同时显式地为变量指派初始值。
记住,声明不会引起分配变量的内存空间,而定义会引起变量内存空间分配。
处理外部变量时,变量可以在许多地方声明为extern,但是只能定义一次。
注意,如果变量定义在包含访问该变量的文件中,那么不需要单独进行extern声明。(这个意思是,可能你import了)
静态变量:
在方法之外定义的变量不仅是全局变量,而且是外部变量。如果希望定义全局变量且只在特定模块(文件)中是全局的,就可以使用static来修饰。
注意,重载alloc并不是好的编程实践,因为这个方法处理内存的物理分配。
枚举数据类型:
枚举数据类型的定义以关键字enum开头,之后是枚举数据类型的名称,然后是标识符序列(包含在一对花括号内),它们定义了可以给该类型指派的所以的允许值。
在代码中定义的枚举类型的作用域限于块的内部。另外,在程序的开始及所有块之外定义的枚举数据类型对于该文件是全局的。
定义枚举数据类型时,必须确保枚举标识符与定义在相同作用域之内的变量名和其他标识符不同。
typedef语句:
通俗点说就是别名。
数据类型转换:
Bool,char,short int,bit field,枚举和int都转为int型。
顶0
|
|