Objective-C - 编写简单方法的最佳实践?

时间:2010-09-16 00:14:41

标签: objective-c function

在以下功能中哪一个是最佳实践?

  1. 要发送自动释放的对象,并让调用者保留它?

  2. 或发送已分配的对象,并让调用者释放它?


  3. - (NSString*) convertDataToString :(NSData*)myData
    {
         //just an example, method might not exist
         NSString *str = [[NSString alloc] initWithData:myData];
         return str;
         return [str autoRelease];
    }
    

6 个答案:

答案 0 :(得分:7)

跟进@ Chuck的评论,-convertDataToString 不得返回调用者必须释放的对象。这会违反Three Magic Words。如果您的名称中没有“copy”,“alloc”或“new”,则不能指望调用者释放该对象。如果您的名字中有“copy”或以“new”或“alloc”开头,则调用者必须释放该对象。

Objective-C在很大程度上依赖于一致的命名,而名称意味着什么。如果你学习了命名,那么你就不会有任何问题。

答案 1 :(得分:3)

memory management rules说你的第一个例子是 - 这是直接引用 - 错了。这甚至不是偏好问题,因为这里的一些答案似乎表明了这一点。调用者通常不拥有您返回的对象,因此应该自动释放。

规则中的具体例子说明了这一点:

  

这是错误的。遵循所有权政策,会导致内存泄漏。

 – (NSArray *)sprockets {

    NSArray *array = [[NSArray alloc] initWithObjects:mainSprocket,
                               auxiliarySprocket, nil];
    return array;
}
  

对象对新数组对象的引用仅限于sprockets方法。方法返回后,对象将失去对新对象的引用,因此无法放弃所有权。这本身不是问题。但是,遵循前面提到的命名约定,调用者不会指示它拥有返回的对象。因此,调用者不会放弃返回对象的所有权,从而导致内存泄漏。

答案 2 :(得分:2)

您希望在大多数情况下返回自动释放的对象。 除非您的方法名称包含以下单词之一[ alloc new copy ],否则您应该返回一个自动释放的对象。

答案 3 :(得分:1)

如果您创建,分配或复制对象,则您有责任释放它。基于此,您应该返回一个自动释放的对象。

答案 4 :(得分:0)

我更愿意退回自动释放。这意味着你不是在寻找内存被释放的地方。保持内存分配和解除分配可以让您的生活更轻松。毕竟,你正在为此编码,为什么要让自己变得更难。

答案 5 :(得分:0)

两者都可以接受,但是你应该相应地命名你的方法:如果调用者有责任解除分配它,你必须通过让你的方法名包含“create”,“alloc”或“copy”来明确这个,否则它不应该。 有关详情,请参阅http://developer.apple.com/library/mac/#documentation/cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html%23//apple_ref/doc/uid/20000994-BAJHFBGH

返回自动释放对象可能有点习惯,但两者都没问题。