繁体   English   中英

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

[英]What is the best way to dealloc memory in Objective C?

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

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

@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,因为只要你在retainCount为1并且释放了该对象,运行时就会立即释放它,并且永远不会减少retainCount 即使它确实减少了retainCount,该对象现在也被释放了。 你怎么会问它什么是retainCount?

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

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

另外,你忘记了dealloc方法中对[super dealloc]的调用。

- (void)dealloc {
    [xyz release];
    [super dealloc];
}

...是正确的版本。 在Objective-C中,通常不应使用retainCount方法。

如果你想要非常安全,你也可以写:

- (void)dealloc {
    [xyz release], xyz = nil;
    [super dealloc];
}

我的想法是myClass有一个成员变量(在你的情况下,xyz)。 当创建myClass对象时,它应该通过仅向保留计数添加1来创建(或获取对xyz的引用)(无论是通过保留还是其他方式取决于具体情况)。

在每种方法中保留xyz并再次释放它不是一个好主意。 因此,在每个方法的最后,本地对象应该在xyz上没有比在方法开头时更多的保留。

当dealloc被调用时,只有那个单独的保留保持应该保留在xyz上(就myClass对象而言),因此单次调用release就足够了。 在retainCount为零之前释放不是一个好主意,因为某个地方的另一个对象可能正在使用它。

要直接回答您的问题,请使用此dealloc:

-(void)dealloc{
    [xyz release];
}

在poperty声明期间保留的对象需要在dealloc方法中释放。 所以,如果你要宣布

@property(nonatomic, retain)NSString xyz;

你需要它以dealloc发布为

-(void)dealloc{
    [xyz release];
    [super dealloc]
}

应该在方法中最后一次使用该对象后立即释放任何其他已分配的内存。

所以,如果你要分配xyz,in

-(void)abc{
    // xyz allocted here
}

那么你应该在同一个方法结束时释放它。

-(void)abc{
    // xyz allocted here
// do something with xyz

//release xyz

例:

        -(void)abc{
           xyz=[[NSString alloc]init];//this may not be what you are following, but i just meant allocating memory
        // do something with xyz


    [xyz release]  

  //release xyz

在这种情况下,您无需在dealloc方法中释放它。

同样不是如果你是声明xyz并对其进行修饰的属性,你不应该在你的方法中分配它,也不应该释放它

    while([xyz retainCount]==0) 
       [xyz release]; 

应该> 0 ,否则不执行-release 即便如此,像这样解除分配xyz是一种不好的做法,因为xyz可能仍然由其他人拥有。

您应该分配xyz有且仅有一个时间,如果你-copy它来代替xyz ,总是-release旧的。 始终遵循Cocoa内存管理规则。

如果你真的需要对xyz采用多个所有权,并且需要一个单独的整数ivar来记录你保留xyz ,那么你在-dealloc有正确的数字来-release

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM