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