第一、关于super
向super发送信息时,实际上是请求Objectiv-c向该类的超类发送消息,如果超类没有定义该消息,objective-c将按照通常的方式在继承链中继续查找对应的消息
第二、关于继承的实例变量
创建一个新类时,其对象首先从其自身的超类继承实例变量,然后再添加自己的实例变量,由于类的基类是NSObject,所以每个类最前面都是isa指针,代表NSObject的实例变量。
第三、lazy eva luation(惰性求值)
在init函数中没有进行创建,当在使用时先判断是否为空,如果为空则创建,这样会节省内存,提高效率
第四、关于属性
利用属性可以减少需要编写的代码,使用@property预编译指令可以通知编译器,该变量具有的特征:可读、可写、对象的内存管理、并发性,此外编译器应该自动生成set方法和get方法。
在xcode4.2版本的编译器上,@property声明的变量,前面加下划线的变量就是私有变量,在_init函数中直接操作该变量,在dealloc函数中一定要release,如果该变量在init函数中没有初始化,也应该release,因为对于nil变量执行release是不会报错的
第五、关于循环引用的问题
A引用B,B引用A,在A的dealloc函数中先要释放B的对象才能【super dealloc】,在B的dealloc函数中先要释放A的对象才能【super dealloc】,陷入死循环。
解除死循环的方法,在B中定义A的变量时为assign
sample code:
- (void)setC:(C *)c
{
if (_c != c) {
[_c release];
_c = [c retain];
}
}
- (void)setB:(B *)b
{
if (_b != b) {
[_b release];
_b = [b retain];
}
}
B *b = [[B alloc] init]; // 1
C *c = [[C alloc] init]; // 1
[b setC:c]; // c : 2
NSLog(@"c retaincount is %lu",[c retainCount]);
[c setB:b];
NSLog(@"b retaincount is %lu",[b retainCount]);
[c release];
[b release];
NSLog(@"c retaincount is %lu",[c retainCount]);
NSLog(@"b retaincount is %lu",[b retainCount]);result:
RetainCycle[1102:303] c retaincount is 2
2013-12-28 21:49:36.936 RetainCycle[1102:303] b retaincount is 2
2013-12-28 21:49:36.937 RetainCycle[1102:303] c retaincount is 1
2013-12-28 21:49:36.937 RetainCycle[1102:303] b retaincount is 1
往下执行:
[c release];
[b release];
就会报错