初学者关于Objective-C 内存管理的几点思考

        内存管理规则就不赘诉了,一般人都知道,无非就是谁持有谁释放。我开始也认为Objective-C内存管理规则挺简单明了。可是在项目开发中确遇到了一些问题。

        做的项目是基于网络的小游戏,大概说说系统结构:UI管理和数据是分离的,通过控制器作为联系(由控制器创建UI管理类和数据类)。底层有负责收发消息的线程,收到消息后拆包转发给控制器。控制器先处理数据,然后调用UI管理模块将处理后的数据在界面上展现。当存在UI操作的时候,调用控制器,然后由控制器处理数据后发送给服务器。

1.循环引用所导致的无法释放的问题:

        这里存在循环引用的问题,即控制器持有了UI管理类的对象引用,由于UI操作需要回调控制器,这时UI管理类又需要持有控制器的引用。当创建控制器的方法需要释放控制器时,由于UI管理器仍然持有控制器的一个引用,所以控制器对象无法被释放。

        那么如何解决这种问题呢:可以尝试在存在循环引用的时候使用弱引用,即不增加对象的引用计数器,当然也不能释放了;可以创建1个stop方法负责主动清理控制器内部持有的引用,并在release之前调用。

        其实官方类库里面就存在了很多循环引用的问题,最典型的就是Delegate,几乎所有的Delegate都使用的是弱引用,这点要非常注意。

2.Delegate的弱引用引发的问题:

        看下面的代码:
    TestDelegate* delegate = [[TestDelegate alloc] init];
    UIAlertView* alertV = [[UIAlertView alloc] initWithTitle:@"title"
                                                     message:@"message"
                                                    delegate:delegate
                                           cancelButtonTitle:@"cancel"
                                           otherButtonTitles:@"ok",nil];
    NSLog(@"retainCount:%d",[delegate retainCount]);
    [alertV show];
    [alertV release];
    
    [delegate release];

       如果是一个初学者,你会惊奇的发现输出的retainCount等于1,点击按钮的时候程序当然要毫不犹豫的报错了。这问题好像没有简单的办法解决。只能靠程序员自己持有对象,然后再在合适的时机释放了。


好像一般的Deleage和Target都不会持有对象引用,但是NSTimer会持有。这只能靠用的时候去尝试了。就算总结出来也没什么意义。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值