设为首页 加入收藏

TOP

objective-c基础教程读书笔记
2014-11-23 20:25:11 来源: 作者: 【 】 浏览:19
Tags:objective-c 基础 教程 读书 笔记

第一、关于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];

就会报错



】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇MFC中几个有用的字符串操作函数 下一篇C语言图形编程--俄罗斯方块制作(..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: