4th*_*ace 8 iphone xcode memory-management objective-c
//creates memory leak
self.editMyObject = [[MyObject alloc] init];
//does not create memory leak
MyObject *temp = [[MyObject alloc] init];
self.editMyObject = temp;
[temp release];
Run Code Online (Sandbox Code Playgroud)
即使您在类的dealloc方法中执行[self.editMyObject release],第一行代码也会产生内存泄漏.self.editMyObject的类型为MyObject.第二行不会导致内存泄漏.第一行是不正确还是有办法释放内存?
Bar*_*ark 10
正确的行为取决于editMyObject @property的声明.假设它是delcared
@property (retain) id editMyObject; //id may be replaced by a more specific type
Run Code Online (Sandbox Code Playgroud)
要么
@property (copy) id editMyObject;
Run Code Online (Sandbox Code Playgroud)
然后通过self.editMyObject =保留或复制指定的对象进行分配.由于[[MyObject alloc] init]返回一个保留的对象,你作为调用者拥有的对象,你有一个额外的MyObject实例保留,因此它将泄漏,除非它有匹配的版本(如在第二个块中).我建议你阅读内存管理编程指南 [2].
假设属性如上所述声明,则第二个代码块是正确的.
ps你不应该[self.editMyObject release]在-dealloc方法中使用.你应该打电话[editMyObject release](假设ivar支持@property被调用editMyObject).调用访问器(通过self.editMyObject@synthesized访问器是安全的,但如果覆盖访问器依赖于对象状态(可能在调用位置无效-dealloc或导致其他副作用),则通过调用访问器会出现错误.
[2] Cocoa中的对象所有权规则非常简单:如果你调用一个方法alloc,或者copy在其签名中(或者使用+[NSObject new]它基本上等同于[[NSObject alloc] init]),那么你"拥有"返回的对象,你必须平衡你的获取拥有所有权release.在所有其他情况下,您不拥有从方法返回的对象.如果你想保留它,你必须拥有一个retain,并在以后释放所有权release.
您的属性被声明为"retain",这意味着传入的对象会自动保留.
因为你的对象已经有来自alloc/init的引用计数为1,所以有两个引用,我假设只有一个版本(在你的析构函数中).
基本上对self.editMyObject的调用实际上是这样做的;
-(void) setEditMyObject:(MyObject*)obj
{
if (editMyObject)
{
[editMyObject release];
editMyObject = nil;
}
editMyObject = [obj retain];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4049 次 |
| 最近记录: |