最佳IOS内存管理@函数调用返回已分配对象

时间:2011-09-02 15:07:38

标签: ios memory-management memory-leaks

我有返回类型的函数(NSArray / NSData / NSString / NSDictionary等)。我可以返回并使用,但我的问题出现@释放对象。请指导哪一个是管理返回对象内存的最佳方法。如果出现任何问题,请忽略并提供最佳解决方案

我已经审阅过Apple内存管理指南

A)

-(NSData *)somefunction2
{  
   NSData *data=[[[NSData alloc]init]autorelease];  
    // fill stuff for nsdata
   return data;
}

-(void)somefunction
{    
NSData *data=[self somefunction2];    
// use data    
}

但大多数博客建议避免自动释放,所以我使用以下类型

B)

-(NSData *)somefunction2
{  
   NSData *data=[[NSData alloc]init];  
    // fill stuff for nsdata
   return data;
}

-(void)somefunction
{

NSData *data=[[self somefunction2] retain];

// use data

[data release];

}

C)

-(NSData *)somefunction2
{  
   NSData *data=[[[NSData alloc]init]autorelease];  
    // fill stuff for nsdata
   return data;
}

-(void)somefunction
{

NSData *data=[[self somefunction2] retain];

// use data

[data release];

}

编辑: 还有一件事。如果我尝试将相同的分配对象传递给某些函数调用Argument或自定义Delegate对象,我必须释放????无论是在函数调用之下还是在函数def中保留然后释放。

NSData *data=[[NSData alloc]init];

[self somfunctioncall:data];

NSData *data=[[NSData alloc]init];

[delegate mydelegatefunction:data];


-(void)somfunctioncall:(NSdata *)data
{
NSData *newdata =[data retain];
//data use
[data release];}

提前致谢

6 个答案:

答案 0 :(得分:3)

最佳做法是,如果方法包含alloc, init, new or retain,则该方法返回retained对象,如果不包含,则返回autoreleased对象。我建议这样做:

-(NSString *)newData
{  
   NSData *data=[[NSData alloc]init];  
    // fill stuff for nsdata
   return data;
}

以后您可以这样做:

-(void)somefunction
{

NSData *data=[self newData];

// use data

[data release];

}

答案 1 :(得分:2)

iOS内存管理有时会令人迷惑!首先,我建议您始终在XCode中运行分析器,指出可能的内存泄漏,这可能非常有用!

由于数据是局部变量,我相信它在两个函数中默认都是自动释放。

我看到奥斯卡刚给你一些改进的代码,这也是我投票的代码。

答案 2 :(得分:1)

我个人更喜欢第三种(C)方式。但是,无需在data中保留和发布someFunction

答案 3 :(得分:1)

A 很好。您返回创建一个对象并返回一个自动释放的对象。另一个函数使用这个对象,因为它不需要保持它通过该方法,它不需要保留或释放它。

在正确的位置使用autorelease有没有错误。名称中没有new,alloc的方法返回自动释放的对象,因此可以在getData中返回一个自动释放的对象(名称错误,但现在让我们离开)。

在其他地方不鼓励自动释放,因为它增加了记忆高水位线。当它被懒惰地使用时会被错误地使用 - 程序员不确定何时可以安全地释放所拥有的对象,所以他们只是自动释放它们。

答案 4 :(得分:0)

“A”是正确的。在iOS中避免autorelease的建议是关于在单个方法中管理对象的生命周期的性能增强,不是跨方法。

答案 5 :(得分:0)

不要忽视autorelease

如果博客告诉你要避免autorelease,他们会给你不好的建议。这是过早的性能优化。使用autorelease会产生更简单的代码,几乎不会损害性能。 确实几次损害了性能,很容易修复。

“A”是正确的。

“B”不正确,因为它不遵循Objective-C命名约定。那很重要。很多。在学习Objective-C约定时,您会发现很难集成此代码。编译器可能会给你不好的警告。 llvm的下一个版本将具有自动引用计数,这意味着您可以依赖编译器为Objective-C对象编写内存管理代码。它基于惯例来做到这一点,所以它会失败。

“C”也是正确的,但在这种情况下不必要地复杂化。如果您在处理数据时有可能耗尽自动释放池,那么这将是正确的代码。