oc的内存管理

作者 : 开心源码 本文共892个字,预计阅读时间需要3分钟 发布时间: 2022-05-14 共213人阅读
@implementation Dog(void)dealloc{  NSLog(@"Dog 被销毁了");  [super dealloc];}@end@class Dog;@interface Person : NSObject@property(retain) Dog *dog;@endint main(int argc, const char * argv[]) {  Person *p1 = [[Person alloc] init];  Person *p2 = [[Person alloc] init];  Dog *d = [[Dog alloc] init];  p1.dog = d;  p2.dog = d;  [d release];  p1.dog = nil;  p2.dog = nil;  return 0;}//Dog *d被销毁了int main(int argc, const char * argv[]) {  Person *p1 = [[Person alloc] init];  Person *p2 = [[Person alloc] init];  Dog *d = [[Dog alloc] init];  p1.dog = d;  p2.dog = p1.dog;  // 只改了这一行  [d release];  p1.dog = nil;  p2.dog = nil;  return 0;}//Dog *d没有被销毁

dog属性公告为了atomic类型,为了保证原子性,dog的set和get方法应该做过解决。我感觉mrc下的atomic属性的set和get方法应该如下

- (Dog *) dog {    Dog *d = nil;     @synchronized(self) {        d = [[_dog retain] autorelease];    }     return d;}- (void)setDog:(Dog *)dog {    @synchronized(self) {        [dog retain];        [_dog release];        _dog = dog;    }}

所以在调用p2.dog = p1.dog;的时候会先调用p1.dog的get方法,内部会对dog retain一次,引用计数+1,而后放进自动释放池,再调用p2.dog的set方法,又会retain一次。最后release的时候-1,引用计数最后依然是1,所以不会被释放

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » oc的内存管理

发表回复