0

注意:我没有使用 ARC

我有一个具有以下属性的 UILabel:@property (nonatomic, retain) UILabel *someLabel;我正在尝试设置自定义设置器。下面的代码是否会导致泄漏,因为@property实际上retain也在调用?

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

    // some custom code here
}
4

4 回答 4

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
  }
}
于 2012-09-30T21:42:47.130 回答
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];
 }
于 2012-09-30T21:41:40.377 回答
0

不,这很好,因为您在这里使用自定义设置器。

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

仅当 setter 和/或 getter 未实现时,@Synthesize 才会基于属性声明属性生成访问器方法。

于 2012-09-30T21:38:27.860 回答
0

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

您是正确的,您过度保留了传入的 someLabel,而且在属性上调用 release 也不是很好!

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

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

    // some custom code here
}
于 2012-09-30T21:39:59.903 回答