Objective-C Custom Setter

时间:2012-09-30 21:30:19

标签: iphone objective-c ios memory-management setter

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

4 个答案:

答案 0 :(得分:8)

  

注意:我没有使用ARC

你真的,真的应该。


你的二传手是一个无限循环。对self.someLabel = ...的调用与[self setSomeLabel:...]完全等效,导致循环。

正确的手动设定器如下所示:

- (void)setSomeLabel:(UILabel *)someLabel
{
  [someLabel retain];
  [_someLabel release];
  _someLabel = someLabel;

  // some custom code here
}

还有其他常见的模式。一个主要问题是,如果将对象重置为相同的值,是否应运行“某些自定义代码”。如果没有,那么这种模式更有意义:

- (void)setSomeLabel:(UILabel *)someLabel
{
  if (someLabel != _someLabel) {
    [_someLabel release];
    _someLabel = [someLabel retain];

    // some custom code here
  }
}

答案 1 :(得分:6)

该代码会导致您的应用无限循环,因为使用self.someLabel会导致调用方法setSomeLabel:

您可以尝试以下代码作为自定义设置器:

 @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];
 }

答案 2 :(得分:0)

不,这完全没问题,因为你在这里使用自定义设置器。

@Property等同于声明访问器方法。

只有在未实现setter和/或getter的情况下,@ Synthesize才会根据属性声明属性生成访问器方法。

答案 3 :(得分:0)

我假设你没有使用ARC ......

你是正确的,你过度保留传入的someLabel,同时在属性上调用release也不是很好!

我会使用实例变量而不是属性:

- (void)setSomeLabel:(UILabel *)someLabel
{
    if (someLabel != _someLabel) {
        [_someLabel release];
        _someLabel = [someLabel retain];
    }

    // some custom code here
}