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

Sag*_*ari 2 iphone xcode memory-management objective-c nsstring

我有关于内存管理的查询.

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

@interface myClass : NSObject {
    NSString *xyz;
}
@end
Run Code Online (Sandbox Code Playgroud)

现在,请参阅实施.

@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
Run Code Online (Sandbox Code Playgroud)

在上面的代码中.我有三个dealloc函数.哪个更好?如果没有这些,那么请建议你的.

我很困惑,因为Objective C说,每次都必须释放对象=每次分配/保留.

但大多数示例代码只有单个语句"[xyz release];" 它不会造成内存泄漏吗?

Dav*_*ong 12

这是绝对错误的:

while([xyz retainCount]>0) 
       [xyz release]; 
    xyz=nil; 
Run Code Online (Sandbox Code Playgroud)

retainCount将永远不会返回0,因为只要您处于retainCount为1且对象被释放,运行时就会立即释放它,并且永远不会减少retainCount.即使它确实减少了retainCount,该对象现在也被释放了.你怎么会问它什么是retainCount?

简而言之,您的设计是错误的.如果你无法跟踪你以更智能的方式保留对象的频率,那么你将会发生内存泄漏,并且很可能会因过度释放的对象而崩溃(这会导致应用程序崩溃).

如果你绝对不能改变你的代码(如果你说你不能改变我就不相信你),那么你想要保留第二个整数ivar,表明你保留了多少次xyz,然后用来弄清楚你应该释放多少次.(但是,这应该是绝对的最后努力,因为如果你没有在30秒内完成这项工作,就会发生Armaggeddon.你应该首先重构你的代码.)

此外,你忘了调用[super dealloc]你的dealloc方法.