功能

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

  • 发送一个自动释放的对象,并使呼叫者保留它?

  • 或发送一个分配的对象,并使呼叫者释放它?


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

    内存管理规则说你的第一个例子是 - 这是一个直接引用 - 错误的。 这甚至不是一个偏好问题,因为这里的一些答案似乎表明。 调用者通常不拥有您返回的对象,因此应该自动发布。

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

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

     – (NSArray *)sprockets {
    
        NSArray *array = [[NSArray alloc] initWithObjects:mainSprocket,
                                   auxiliarySprocket, nil];
        return array;
    }
    

    该对象对新数组对象的引用仅限于链轮方法。 方法返回后,对象失去对新对象的引用,因此不能放弃所有权。 这本身并不是问题。 但是,按照前面提出的命名约定,调用者不会被指示拥有返回的对象。 因此调用者不会放弃返回对象的所有权,导致内存泄漏。


    跟随@ Chuck的评论, -convertDataToString不能返回调用者必须释放的对象。 这会违反三个魔术词。 如果您的姓名中没有“复制”,“分配”或“新”,则不能期望调用者释放该对象。 如果你的名字中有“copy”或者以“new”或“alloc”开头,那么调用者必须释放该对象。

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


    大部分时间你都希望返回一个自动释放的对象。 除非你的方法名包含以下单词之一[alloc,new,copy],否则你应该返回一个自动释放对象。

    链接地址: http://www.djcxy.com/p/43729.html

    上一篇: function

    下一篇: Clang static analyzer gives warning over autoreleased