我有返回类型的函数(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];}
提前致谢
答案 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”也是正确的,但在这种情况下不必要地复杂化。如果您在处理数据时有可能耗尽自动释放池,那么这将是正确的代码。