Objective-C(iPhone)ivars和内存管理
我是NSURLConnection的子类,并使用MGTwitterEngine作为基础来帮助我开始.这可能是无关紧要的.但是,我注意到他们的代码中没有使用@property或@synthesize作为他们的ivars.他们将ivars包装在accessor方法中,如下所示:
- (NSString *)identifier { return [[_identifier retain] autorelease]; } 我的问题是两部分.首先,自动释放后保留的效果是什么?在我看来它会取消自己,或者更糟糕但是泄漏. 其次,如果我要更改头文件: @property (nonatomic,retain,readonly) NSString* _identifier; 并使用@synthesize indentifier = _identifier,这不会与访问器方法做同样的事情而不必写它吗? 也许只是两种不同的方式来做同样的事情.但我想确保我有正确的理解.谢谢. 解决方法
使用@synthesize实际上只会创建一个setter和一个getter方法.为您自动生成的代码保证使用适当的内存管理,因此您无需担心.
MGTwitterEngines使用return [[ivar retain] autorelease]实际上是正确的方法.让我们举两个例子. 假设getter定义为: -(Foo)foo { return foo; } 然后我们执行这段代码: > bar = [[bar alloc] init]; // bar的计数为1. 如果我们改为将getter更改为: -(Foo)foo { return [[foo retain] autorelease]; } > bar = [[bar alloc] init]; // bar的保留计数为1 希望这能解释为什么你应该总是从你所有的getter中返回正确的自动释放对象.重要的是,任何返回值都可以在其父级的解除分配后继续存在,因为没有类可以保证客户端一旦暴露在野外就会对其值进行处理. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |