gpt4 book ai didi

iphone - Objective C 中释放内存的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-03 20:18:12 25 4
gpt4 key购买 nike

我对内存管理有疑问。

让我们从一个例子开始。假设我们有一个类如下。

@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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com