【问题标题】:what is the difference between '.' and '->' iOS?'.' 和有什么不一样?和'->' iOS?
【发布时间】:2012-11-08 10:26:14
【问题描述】:

好吧,我很困惑! 我曾经在访问我的实例对象时使用 ->,但现在我看到在我的应用程序中设置它们之后:didFinishLaunching 如下所示:

self->counter = [NSNumber numberWithFloat:0.0f];

在路上我被抛出异常,检查了我的调试器,发现计数器指向 <non objective c object>

我将行改为:

self.counter = [NSNumber numberWithFloat:0.0f];

现在我在调试器中看到我有另一个变量。

那么,这里发生了什么?

【问题讨论】:

    标签: ios objective-c xcode syntax member-access


    【解决方案1】:

    您是在询问 iVar 和属性之间的区别。这个问题已经有很好的答案here

    【讨论】:

      【解决方案2】:

      self->counter = [NSNumber numberWithFloat:0.0f]; 使用对 ivar 的直接访问。对于self,它等于counter = [NSNumber numberWithFloat:0.0f];,其中counter 是一个ivar。也就是说self->是一个实例方法内的多余作用域限定。

      self.counter = [NSNumber numberWithFloat:0.0f];[self setCounter:[NSNumber numberWithFloat:0.0f]]; 的语法糖。具体来说,声明动态地向对象的设置器发送消息以获取计数器。 Although there are exceptions,您应该倾向于在不处于部分构造/破坏状态时使用访问器。

      【讨论】:

      • 要添加到这个正确答案,self->counter 形式不仅在实例方法范围内是多余的,它还会在该范围之外引发警告(或错误),除非 ivar 被标记(奇怪的是。 ..) @public
      • @NSBum Right +1,尽管在 ObjC 中访问不一致且复杂。如果您正在编写较新的 ABI,则正确检查访问。较旧的 ABI 或编译器可能会发出警告。如果在 @interface 中声明,则默认为 @protected,在 @implementation 块中声明时,默认为 @private。 clang 还允许访问 @implementation 正文中的私人信息(例如,如果使用静态函数)——正如预期的那样,这是 @implementation 正文之外的错误 O_O
      猜你喜欢
      • 2012-05-27
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 2021-11-29
      • 2011-08-16
      • 2021-06-23
      • 2019-04-04
      • 2011-02-20
      相关资源
      最近更新 更多