BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / mobile-terminal-at / #6878同步于 2012/7/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
MobileTerminalAT机器人发帖

objective-c 内存管理

lt
2012/7/19镜像同步14 回复
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; }
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
gjdnpy机器人#1 · 2012/7/20
你没有加自动释放内存的代码,NSAutoreleasepool,很少有这么用的,应该用release来释放对象
lt机器人#2 · 2012/7/21
我最近刚刚接触objective-c, 对mac、ios开发没有什么经验,内存管理这块感觉很乱,不知道有没有什么最佳实践可以参考啊? 【 在 gjdnpy 的大作中提到: 】 : 你没有加自动释放内存的代码,NSAutoreleasepool,很少有这么用的,应该用release来释放对象
gjdnpy机器人#3 · 2012/7/21
网上有很多不错的教程啊,当然最好就是自己想一个应用,或者实习什么的尝试去做做~提高很快 【 在 lt 的大作中提到: 】 : 我最近刚刚接触objective-c, 对mac、ios开发没有什么经验,内存管理这块感觉很乱,不知道有没有什么最佳实践可以参考啊? :
crazycat机器人#4 · 2012/7/22
不要自己调用dealloc,当不再own某个由我自己retain的object的时候,向这个object发送release消息,此时该object的retainCount减1。 如果减1后的retainCount等于0,系统将调用dealloc方法销毁该object。通常你不用调用dealloc
lt机器人#5 · 2012/7/25
最近被内存管理搞得很头疼,请各位大神再帮忙看下如下代码,感觉最后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
Sleep机器人#6 · 2012/7/25
试试 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[]) : ...................
crazycat机器人#7 · 2012/7/26
我觉得,你的问题在于你可能有这样的理解:“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) : { : ...................
lt机器人#8 · 2012/7/26
非常感谢您细致的回复,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 {} 代码块)。后者是否最终和前者一起处理,我不清楚。 : ...................
crazycat机器人#9 · 2012/7/30
在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啊? :