功能
在以下功能中哪一个是最佳实践?
发送一个自动释放的对象,并使呼叫者保留它?
或发送一个分配的对象,并使呼叫者释放它?
- (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