【问题标题】:What's the difference between self.propertyName vs. propertyName?self.propertyName 与 propertyName 有什么区别?
【发布时间】:2011-06-18 09:34:38
【问题描述】:

标题说明一切!

在 Objective-C 中,self.propertyNamepropertyName 有什么区别?

【问题讨论】:

  • 搜索功能坏了吗?这个问题肯定已经被问过几十次了。在这里查看相关帖子以获取一些-------->
  • @roger,尝试在提问页面粘贴相同的标题和问题,您会发现自己。 :)
  • .. 从我现在的位置来看,它看起来并没有坏掉;-)

标签: iphone objective-c


【解决方案1】:

self.propertyName 正在向对象发送一条消息,要求它提供 propertyName 的值,这意味着它可能会通过 getter/setter 等。propertyName 正在直接访问 ivar,绕过任何 getter/setter . Here's an article 更详细地介绍它。

【讨论】:

    【解决方案2】:

    self.propertyName 如果您在属性声明中将 propertyName 指定为保留,则将保留计数加一

    propertyName 不会增加保留计数,可能导致应用程序崩溃。

    e。 G。 ,

    @property (nonatomic,retain) NSString* propertyName;
    

    假设你有 nameProperty NSString 对象。 下面将保留计数增加 1,您可以使用 self.propertyName 并调用 release

    self.propertyName = nameProperty;
    [nameProperty release];
    

    以下不会增加保留计数,因此如果您在应用程序中使用 propertyName 会导致应用程序崩溃。

    propertyName = nameProperty;
    [nameProperty release]; 
    

    进一步使用propertyName 将导致崩溃。

    【讨论】:

    • 它不对BOOLNSIntegerCGFloat等非对象类型进行任何内存管理。
    • self.propertyName 增加保留计数是错误的。当用作 getter 时,它不会增加保留计数。当分配的对象与当前存储在支持实例变量中的对象相同时,它也不会增加保留计数。
    • 嘿,我还是不明白为什么投了反对票? jhaliya 给出的是对这种情况的完美回答,他没有给出访问对象的示例,甚至没有说通过访问对象保留计数将是显而易见的事情。我认为我们必须鼓励社区成员不要为他没有做的事情投反对票。我要求所有社区成员支持其他人的帮助。投票权仅提供给受人尊敬的成员,并且应该非常小心地使用。 jhaliya +100(我希望我能投票 100 次)。 :)
    • @Guru 这不是一个完美的答案 IMO,尽管您认为它很有用,但下一个出现并阅读此答案的人会认为它是完美的,除非 community 给出回答评分。其次,downvotes 不是惩罚,它们对代表的影响远小于 upvote。如果您从本次讨论中了解到一件事,那就是您不应该考虑对象的 retainCount,而只考虑是否有责任在其上调用 release
    【解决方案3】:

    自我。如果您正在使用属性,则遍历您可能合成的访问器方法

    即 self.propertyName = newName 与 [self setPropertyName:newName] 相同

    这对于内存管理变得很重要,因为 propertyName = newName 会导致您失去对 propertyName 先前内容的引用

    【讨论】:

      【解决方案4】:

      如果你调用 self,你可以确定你调用的是拥有该属性的类/对象。

      您可能会发现这也很有用:

      Assigning to self in Objective-C

      【讨论】:

        【解决方案5】:

        点符号被编译器转换为方法调用。这意味着在运行时有额外的工作来执行这个方法调用,比如从堆栈内存中复制一些东西,以及在机器代码中执行一个跳转。

        实例变量本身更快,因为它本质上只是一个内存地址或标量值(如 int)。

        当您想要或需要额外的层来做某事时,人们会更喜欢 self.something 表示法。比如保留传入的对象,或者在第一次需要时懒惰地实例化一个对象。

        【讨论】:

          【解决方案6】:

          设置属性的值就是这样做的——它直接设置属性的值,而不通过任何访问器或合成访问器。

          通过self 调用访问器,您将通过访问器。对于已用retaincopy 声明的属性,它将传入retaincopy 的值。对于非对象属性,通常声明为assign,这意味着没有内存管理应用于那些 iVar。

          您会看到这两种类型的调用 - 但最好在初始化程序中使用直接方法和 dealloc 方法,因为不鼓励在这些方法中调用 self

          如果您已声明并综合了该属性,则对self 的调用也会生成KVO 通知以通知该变量的更改。这使您不必编写 willChangeValueForKey:didChangeValueForKey: 方法。

          【讨论】:

          • 无意冒犯,请不要在这里使用像 retaliation 这样的词。我这边没有什么私人的,不确定你是否结束,请不要在这里误导人们,我们在这里支持社区开发人员,给他们一个更好的答案,而不是总结性的答案,
          猜你喜欢
          • 1970-01-01
          • 2021-12-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-19
          • 2013-03-14
          • 2018-09-14
          • 2014-01-03
          • 2021-12-22
          相关资源
          最近更新 更多