Iphone Objective-C自定义设置器

Iphone Objective-C自定义设置器,iphone,objective-c,ios,memory-management,setter,Iphone,Objective C,Ios,Memory Management,Setter,注意:我没有使用ARC 我有一个具有以下属性的UILabel:@property(非原子,保留)UILabel*someLabel我正在尝试设置自定义设置器。以下代码是否会导致泄漏,因为@property实际上也在调用retain - (void)setSomeLabel:(UILabel *)someLabel { if (someLabel != self.someLabel) { [self.someLabel release]; self.some

注意:我没有使用ARC

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

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

    // some custom code here
}

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

@属性只相当于声明访问器方法


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

我假设您没有使用ARC

您是对的,您过度保留了传入的someLabel,同时对属性调用release也不是很好

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

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

    // some custom code here
}

该代码将引导你的应用程序使用
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];
 }
注意:我没有使用ARC

你真的,真的应该


您的setter是一个无限循环。对
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
  }
}

@InsertWittyName,你是什么意思?虽然Shashikanth没有捕捉OP代码中的无限循环,但他关于属性和合成的陈述是正确的。属性声明和直接声明访问器之间有着非常微妙的区别,但这很少重要。@RobNapier抱歉,我的评论有点“短”,不应该如此。我确实认为,对财产和综合的解释本可以更清楚一些(然而,它们的描述是正确的)。投票赞成以抵消荒谬的反对票。在绝大多数情况下,这个答案是正确的,撇开setter中缺少点语法的使用不谈,这里没有过度设置,只有无限递归。(撇开迂腐的观点不谈,无限递归将无限保留;但修复递归将修复保留)
be
\u someLabel=someLabel取而代之?ARC下是否仍需要此保留/释放洗牌?合成setter是否还有其他我们必须模仿的魔法(比如使用各种修饰符,如
strong
非原子的
等等)。不,您不需要在ARC下使用
保留
释放
(事实上它们是非法的)。您可以在setter中正常地分配ivar。如果其中一个访问器不是自定义的(如果两者都是自定义的,则必须自己声明ivar),则属性的修饰符(强/弱)将自动应用于ivar。“非原子”只是意味着“不要做原子的事情”。我不建议完全重新创建“原子的”;最好使用基于队列的访问器(请参阅)