你说:
我写了一个方便的函数来获取UIColor
一个十六进制字符串。在其中,它返回
[[UIColor alloc] initWithRed:... alpha:alpha]
根据Basic Memory Management Rules,正确的内存管理由您的方法名称决定:
如果你的方法名不是以“alloc”、“new”、“copy”或“mutableCopy”开头,那么你应该返回一个autorelease
对象:
- (UIColor *)colorWithHexString:(NSString *)hexString {
...
return [[[UIColor alloc] initWithRed:... alpha:alpha] autorelease];
}
如果您的方法名称确实以“alloc”、“new”、“copy”或“mutableCopy”开头,那么您可以像上面一样返回一个对象:
- (UIColor *)newColorWithHexString:(NSString *)hexString {
...
return [[UIColor alloc] initWithRed:... alpha:alpha];
}
请注意,这种模式不如上述colorWithHexString
.
(注意,这种由方法名前缀决定的内存管理在历史上只是最佳实践,但现在,为了与 ARC 代码的互操作性,这一点至关重要。在手动引用计数代码中始终遵循上述规则。)
现在,如果调用您的便捷初始化程序的代码允许释放对象,那么问题出在该代码上,而不是您的便捷初始化程序。不要开始向retain
你的初始化程序添加额外的语句,因为调用它的东西不能正确管理它的内存。
相反,请确保调用代码执行, 本身的结果的正确retain
(和最终) 。release
colorWithHexString
顺便说一句,Xcode 的静态分析器 ( shift++ command)B非常擅长分析手动引用计数代码并识别问题。
在编辑您的问题时,您引用了文档:
如果您从程序的其他地方收到一个对象,通常保证它在接收它的方法或函数内保持有效。如果您希望它在该范围之外保持有效,您应该retain
或copy
它。如果你试图释放一个已经被释放的对象,你的程序就会崩溃。
这并不是说您的便利初始化程序应该发出retain
or copy
。也就是说,调用的代码colorWithHexString
负责建立自己对通过orUIColor
返回的对象的所有权声明,如上所述。retain
copy