Objective-C Custom Setter

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)

Rob*_*ier 8

注意:我没有使用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)


Nek*_*kto 6

该代码将导致您的应用程序无限循环,因为使用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)