返回信息流p1 p2指向同一个对象,dealloc对象,为何仍然可以使用p2?
代码如下,求大神路过解答。
int main(int argc, const char * argv[])
{
Person *p1 = [[Person alloc] init];
Person *p2 = p1;
[p1 say];
[p1 dealloc];
[p2 say]; // why not crash ?
return 0;
}
这是一条镜像帖。来源:北邮人论坛 / mobile-terminal-at / #6878同步于 2012/7/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
MobileTerminalAT机器人发帖
objective-c 内存管理
lt
2012/7/19镜像同步14 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
我最近刚刚接触objective-c, 对mac、ios开发没有什么经验,内存管理这块感觉很乱,不知道有没有什么最佳实践可以参考啊?
【 在 gjdnpy 的大作中提到: 】
: 你没有加自动释放内存的代码,NSAutoreleasepool,很少有这么用的,应该用release来释放对象
网上有很多不错的教程啊,当然最好就是自己想一个应用,或者实习什么的尝试去做做~提高很快
【 在 lt 的大作中提到: 】
: 我最近刚刚接触objective-c, 对mac、ios开发没有什么经验,内存管理这块感觉很乱,不知道有没有什么最佳实践可以参考啊?
:
不要自己调用dealloc,当不再own某个由我自己retain的object的时候,向这个object发送release消息,此时该object的retainCount减1。
如果减1后的retainCount等于0,系统将调用dealloc方法销毁该object。通常你不用调用dealloc
最近被内存管理搞得很头疼,请各位大神再帮忙看下如下代码,感觉最后Person对象为0,但是输出为1,求大神解答下
Person* createPerson(NSString *name)
{
Person *p = [[Person alloc] initWithName:name];
return [p autorelease];
}
int main(int argc, const char * argv[])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
Person *p = createPerson(@"Peter"); // retain is 1
NSMutableArray *arr = [NSMutableArray new];
[arr addObject:p]; // retain is 2
NSLog(@"retain is %lu", [p retainCount]);
[arr release]; // retain is 1
NSLog(@"retain is %lu", [p retainCount]);
[pool release]; // retain should be 0, but now is 1, why?
NSLog(@"retain is %lu", [p retainCount]);
return 0;
}
【 在 crazycat 的大作中提到: 】
: 不要自己调用dealloc,当不再own某个由我自己retain的object的时候,向这个object发送release消息,此时该object的retainCount减1。
: 如果减1后的retainCount等于0,系统将调用dealloc方法销毁该object。通常你不用调用dealloc
试试
int main(int argc, const char * argv[])
{
Person *p1 = [[Person alloc] init];
Person *p2 = [p1 retain];
[p1 say];
[p1 release];
[p2 say]; // why not crash ?
[p2 release];
return 0;
}
【 在 lt 的大作中提到: 】
: p1 p2指向同一个对象,dealloc对象,为何仍然可以使用p2?
: 代码如下,求大神路过解答。
: int main(int argc, const char * argv[])
: ...................
我觉得,你的问题在于你可能有这样的理解:“autorelease pool一旦release或drain,里面的object的retainCount都变0,然后dealloc掉”, 是否?如果是, 这个理解是错的。
autorelease pool挺复杂的,我没有完全搞明白,说一下目前自己的理解:
autorelease pool 从代码表层上看可能有两种,一种是系统自动创建的,一种是你自己显式创建的(比如@autorelease pool {} 代码块)。后者是否最终和前者一起处理,我不清楚。
不管哪一种,当pool release的时候会向pool内的object发送release消息,将其retainCount减1。如果此时pool内object的retainCount为0,就将这些object从内存删除。 因此,一个对象是autorelease的,在autorelease pool内,并不意味着pool release的时候就将该对象从内存删除,仅仅删除retainCount为0的。autorelease只不过是延迟release的手段,不是garbage collection。
【 在 lt 的大作中提到: 】
: 最近被内存管理搞得很头疼,请各位大神再帮忙看下如下代码,感觉最后Person对象为0,但是输出为1,求大神解答下
: Person* createPerson(NSString *name)
: {
: ...................
非常感谢您细致的回复,pool drain后会对pool中的每个对象发送release消息,然后pool中的每个对象的retain减1,如果对象retain减1后为0,则会像对象发送dealloc消息,然后对象被销毁。
但是现在,那个Person对象在pool drain之前Person的retain是1,pool drain之后retain还是1,我对这个就不知道是怎么回事了,我感觉应该是0,然后被dealloc啊?
【 在 crazycat 的大作中提到: 】
: 我觉得,你的问题在于你可能有这样的理解:“autorelease pool一旦release或drain,里面的object的retainCount都变0,然后dealloc掉”, 是否?如果是, 这个理解是错的。
: autorelease pool挺复杂的,我没有完全搞明白,说一下目前自己的理解:
: autorelease pool 从代码表层上看可能有两种,一种是系统自动创建的,一种是你自己显式创建的(比如@autorelease pool {} 代码块)。后者是否最终和前者一起处理,我不清楚。
: ...................
在Person类里加dealloc方法,
- (void) dealloc
{
NSLog(@"person dealloc called");
[super dealloc];
}
发现pool release之后, dealloc的确被调用了,在此之后,使用p指针应该出错才对,现在反而可以得到retainCount为1。
没想明白。想到了再来贴。
【 在 lt 的大作中提到: 】
: 非常感谢您细致的回复,pool drain后会对pool中的每个对象发送release消息,然后pool中的每个对象的retain减1,如果对象retain减1后为0,则会像对象发送dealloc消息,然后对象被销毁。
: 但是现在,那个Person对象在pool drain之前Person的retain是1,pool drain之后retain还是1,我对这个就不知道是怎么回事了,我感觉应该是0,然后被dealloc啊?
: