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

标签 iphone objective-c xcode memory-management nsstring

我对内存管理有疑问。

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

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

相关文章:

ios - 如何在播放视频时自动跳过 YouTube iOS 应用中的广告?

objective-c - 网络扩展 - NEVPNManager

Xcode:malloc_error_break 上的自动(永久)断点?

ios - EXC_BAD_ACCESS 仅当从 UITableView 中一直向下滚动返回时

iphone - 如何一次为所有元素设置 VoiceOver 辅助语言?

iphone - 如何修复 xcode 警告 "Expression result unused"

iphone - 为什么页面控件点从一页变为下一页

objective-c - 模拟Objective C中的抽象类和抽象方法?

objective-c - 发送十六进制数据到设备(Converting NSString to hexadecimal data)

ios - Xcode、 swift : How to center popover box