我对内存管理有疑问。
让我们从一个例子开始。假设我们有一个类如下。
@interface myClass : NSObject {
NSString *xyz;
}
@end
现在,查看实现。
@interface myClass : NSObject {
NSString *xyz;
}
@end
@implementation myClass
-(void)abc{
// xyz allocted here
}
-(void)pqr{
// retained or copied many times or may not a single time
}
-(void)mno{
// retained or copied many times or may not a single time
}
-(void)jpg{
// may be released more than one time or may be not
}
//-(void)dealloc{
// [xyz release];
// [super dealloc];
//}
//
//-(void)dealloc{
// if(xyz!=nil && [xyz retainCount]>0){ [xyz release]; xyz=nil; }
// [super dealloc];
//}
-(void)dealloc{
if(xyz!=nil){
while([xyz retainCount]>0)
[xyz release];
xyz=nil;
}
[super dealloc];
}
@end
在上面的代码中。我有三个 dealloc 函数。哪一个更可取?如果这些都不是,那么请推荐您的。
我很困惑,因为 Objective C 说,每次必须释放对象 = 每次分配/保留。
但是大多数示例代码只有单个语句“[xyz release];”不会造成内存泄漏吗?
最佳答案
这是绝对错误的:
while([xyz retainCount]>0)
[xyz release];
xyz=nil;
retainCount
永远不会返回 0,因为一旦保留计数为 1 并且对象被释放,运行时就会立即释放它,永远不会减少保留计数。即使它确实减少了保留计数,该对象现在也已被释放。你如何询问它的retainCount 是什么?
简而言之,你的设计是错误的。如果您无法以更智能的方式跟踪保留对象的频率,那么您将出现内存泄漏,并且很可能因过度释放对象而崩溃(此 while 循环将使您的应用程序崩溃) .
如果你绝对不能改变你的代码(如果你说你不能改变我不会相信你),那么你会想要保留第二个整数ivar来指示你保留了多少次 xyz
,然后使用 that 计算出应该释放它多少次。 (然而,这应该是绝对的最后一搏,如果你在 30 秒内没有完成这个工作,就会发生世界末日。你真的应该首先重构你的代码。)
此外,您忘记了在 dealloc
方法中调用 [super dealloc]
。
关于iphone - Objective C 中释放内存的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2197721/