【问题标题】:Is there a difference between setting a property with the dot or the bracket syntax?使用点或括号语法设置属性有区别吗?
【发布时间】:2010-02-05 14:25:51
【问题描述】:

鉴于下面的属性声明,方法 (A) 的工作方式与方法 (B) 完全相同吗?我只想检查self.yellowViewController = yellcon_New; 是否正在通过我的setter,以便旧对象被释放并保留新对象。

// INTERFACE
@property(nonatomic, retain) YellowViewController *yellowViewController;

// IMPLEMENTATION (A)
self.yellowViewController = yellcon_New;

// IMPLEMENTATION (B)
[self setYellowViewController:yellcon_New];

【问题讨论】:

    标签: objective-c syntax declared-property


    【解决方案1】:

    所有这些都是正确的:

    self.yellowViewController = yellcon_New;
    

    还有

    [self setYellowViewController:yellcon_New];
    

    工作相同。 我想补充一些有趣的东西:当你使用时

    yellowViewController = yellcon_New;
    

    您直接将值关联到 ivar,而无需通过您的 setter 方法。

    如果你有

    -(void)setYellowViewController:(YellowViewController*)theYellowViewController;
    {
        NSLog(@"Setting the yellow view controller");
        [yourWife askFor:beer];
        ...whatever...
        ...set the yellowViewController (retain in your case)
    }
    

    打电话

    self.yellowViewController = yellcon_New;
    

    [self setYellowViewController:yellcon_New];
    

    将使用setter方法(并记录消息,并让你的妻子给你带来一些啤酒)

    但是

    yellowViewController = yellcon_New;
    

    不会。

    在某些情况下知道这一点很有趣。

    【讨论】:

      【解决方案2】:

      是的,A 线和 B 线是一样的

      您可以通过使用@dynamic 而不是@synthesize 来检查此属性并将NSLog 消息放入您的setter 方法的实现中。

      【讨论】:

      • 不需要@dynamic。如果你实现了 setter 方法,编译器不会生成 setter。
      • ...这很重要,因为如果您需要自定义 setter,您仍然可以使用它来生成 getter,反之亦然。它还有助于快速将日志记录添加到访问器之一以进行调试,而无需更改太多代码。
      【解决方案3】:

      是的。如果您对该属性使用 @synthesize 事物,它会为您创建一个 -setYellowViewController: 方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-08
        • 2014-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多