dar*_*sky 0 iphone setter memory-management objective-c ios
注意:我没有使用ARC
我有一个具有以下属性的UILabel:@property (nonatomic, retain) UILabel *someLabel;我正在尝试设置自定义setter.以下代码是否会导致泄漏,因为@property实际上也是在调用retain?
- (void)setSomeLabel:(UILabel *)someLabel
{
if (someLabel != self.someLabel) {
[self.someLabel release];
self.someLabel = [someLabel retain];
}
// some custom code here
}
Run Code Online (Sandbox Code Playgroud)
注意:我没有使用ARC
你真的,真的应该.
你的二传手是一个无限循环.调用self.someLabel = ...与确切等效[self setSomeLabel:...],导致循环.
正确的手动设置器如下所示:
- (void)setSomeLabel:(UILabel *)someLabel
{
[someLabel retain];
[_someLabel release];
_someLabel = someLabel;
// some custom code here
}
Run Code Online (Sandbox Code Playgroud)
还有其他常见的模式.一个主要问题是,如果将对象重置为相同的值,是否应运行"某些自定义代码".如果没有,那么这种模式更有意义:
- (void)setSomeLabel:(UILabel *)someLabel
{
if (someLabel != _someLabel) {
[_someLabel release];
_someLabel = [someLabel retain];
// some custom code here
}
}
Run Code Online (Sandbox Code Playgroud)
该代码将导致您的应用程序无限循环,因为使用self.someLabel调用方法setSomeLabel:.
您可以尝试以下代码为您的自定义setter:
@synthesize someLabel = _someLabel;
- (void)setSomeLabel:(UILabel *)someLabel
{
if (someLabel != _someLabel)
{
[_someLabel release];
_someLabel = [someLabel retain];
}
// custom code
}
- (void)dealloc
{
[_someLabel release];
// ... other releases
[super dealloc];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5006 次 |
| 最近记录: |