【OC笔记】关于MRC中的注意问题

一、程序代码:

#import <Foundation/Foundation.h>

//Person类的声明
@interface Person : NSObject
@property (nonatomic,retain) Dog *dog;
@end

//Person类的实现

@implementation Person
- (void)dealloc
{
NSLog(@"self:%@ --%@",self.dog,_dog);
//self.dog = nil; //注意点:1
[_dog release];
NSLog(@"Person dealloc");
[super dealloc];
}
@end

//Dog类的声明

@interface Dog : NSObject

@end
//Dog类的实现
@implementation Dog
- (void)dealloc
{
NSLog(@"Dog dealloced");
[super dealloc];
}
@end


int main(int argc, const char * argv[]) {
@autoreleasepool {

Person *p = [Person new];
Dog *d = [Dog new];
p.dog = d;
NSLog(@"dog retainCount = %lu,person retainCount = %lu",d.retainCount,p.retainCount);
 // 这一句应该放到最后面,因为dog已经销毁了,但是person的实例没有销毁,有可能在中间会调用person的 dog实例

[d release]; //注意点:2

NSLog(@"dog retainCount = %lu,person retainCount = %lu",d.retainCount,p.retainCount);
[p release];
// NSLog(@"dog retainCount = %lu",d.retainCount);

}
return 0;
}

问题分析:
注意点1:
      self.dog = nil; 和 [_dog release];的作用一样,在Person实例销毁前调用一次该方法,对Dog实例进行一次release操作。
关于self.dog 和 _dog 的内存空间测试:
self.dog: <Dog: 0x100111180> _dog: <Dog: 0x100111180>
两个都指向Person实例中的dog实例,但是self.dog = nil 可以使dog实例release一次,而_dog = nil 缺只是将Person 实例中的dog指针指向nil,没有release。

注意点2:
虽然 [d release];和 [p release];先后顺序对最后的内存释放没有影响,但是从程序的逻辑性和健壮性来讲 [d release];应该放在 [p release];后面,因为:如果 dog已经销毁了, person的实例没有销毁,有可能在中间会调用perso实例的dog实例,在这里会出问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值