在iPhone开发ObjC中,我想知道函数在Dictionaries或Arrays中返回某些值的正确方法是什么。我的意思是他们应该返回autorelease对象,但如果我使用太多的函数来返回值,那就不会很糟糕,比如getUserRecordsFromDB()函数将返回所有用户记录,那么他们应该返回自动释放对象吗?当我多次呼叫它们时,假设用4秒的时间来获取新近更新的数据。有人能让我理解如何从程序流中频繁调用的函数中获取数据,而不是泄漏内存。
答案 0 :(得分:3)
我们应该始终从函数返回自动释放对象,并通过在调用函数中设置自动释放池来确保它们被释放,如下所示
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// Call database function here...
[pool release];
请参阅自动发布池文档here
答案 1 :(得分:1)
如果方法在同一个类中,则使用全局变量,如果它在某个其他类中,请确保它只被分配一次,每次调用该方法时重用相同的内存。
答案 2 :(得分:0)
是的,您应该使用自动释放的对象作为返回值。
答案 3 :(得分:0)
你应该坚持可可的编程指南。 This is a place to start,但在此主题上还有很多内容可以找到。
答案 4 :(得分:0)
您始终可以传递要填写的可变对象。
-(void) getMoreUsers:(NSMutableArray *)ioArray {
for ( ... ) {
NSMutableDictionary *user = [NSMutableDictionary new];
// fill in user ...
[ioArray addObject:user];
[user release]; // explicit release so only reference is owned by ioArray
}
}
当您知道对象的生命周期时,这会为您提供明确的控制,但是当您想要使用自动释放时,可以轻松编写包装器。
-(NSArray *) getUsers {
NSMutableArray *result = [NSMutableArray array]; // implicit autorelease
[self getMoreUsers:result];
return result;
}
使用具有已知生命周期的示例将是:
-(void) operateOnUsers {
NSMutableArray *array = [NSMutableArray new];
[self getMoreUsers:array];
// do stuff that will not retain array
[array release];
}