在不泄漏内存的情况下从函数返回数据的理想方法是什么?

时间:2011-05-17 08:41:38

标签: iphone objective-c

在iPhone开发ObjC中,我想知道函数在Dictionaries或Arrays中返回某些值的正确方法是什么。我的意思是他们应该返回autorelease对象,但如果我使用太多的函数来返回值,那就不会很糟糕,比如getUserRecordsFromDB()函数将返回所有用户记录,那么他们应该返回自动释放对象吗?当我多次呼叫它们时,假设用4秒的时间来获取新近更新的数据。有人能让我理解如何从程序流中频繁调用的函数中获取数据,而不是泄漏内存。

5 个答案:

答案 0 :(得分:3)

我们应该始终从函数返回自动释放对象,并通过在调用函数中设置自动释放池来确保它们被释放,如下所示

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

// Call database function here...

[pool release];

请参阅自动发布池文档here

答案 1 :(得分:1)

如果方法在同一个类中,则使用全局变量,如果它在某个其他类中,请确保它只被分配一次,每次调用该方法时重用相同的内存。

同时检查NSAutoreleasePool

答案 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];
}