oc的内存管理

@implementation Dog

(void)dealloc
{
  NSLog(@"Dog 被销毁了");
  [super dealloc];
}

@end
@class Dog;
@interface Person : NSObject

@property(retain) Dog *dog;

@end

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 = 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,所以不会被释放

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • OC内存管理一、基本原理(一)为什么要进行内存管理。由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制...
    ScaryMonsterLyn阅读 535评论 0 3
  • OC内存管理 一、基本原理 (一)为什么要进行内存管理。 由于移动设备的内存极其有限,所以每个APP所占的内存也是...
    柯西班的小西西阅读 297评论 0 0
  • 版权声明:本文为博主原创文章,未经博主允许不得转载。 一、基本原理 (一)为什么要进行内存管理。 由于移动设备的内...
    LeaderBiao阅读 398评论 0 2
  • 今天看到一篇不错的文章关于OC内存管理的,转载一下与你共享概述我们知道在程序运行过程中要创建大量的对象,和其他高级...
    niceSYT阅读 474评论 0 2
  • 基本原理 (—)为什么要进行内存管理 由于移动设备的内存有限,每个app所占的内存是及其有限的,当app所占用的内...
    当优秀成为习惯阅读 130评论 0 0