代码之家  ›  专栏  ›  技术社区  ›  mk12

目标C-如果没有任何不同,则使用访问器

  •  4
  • mk12  · 技术社区  · 15 年前

    在目标C中,如果使用getter和直接访问ivar做了完全相同的事情,getter中没有延迟加载代码,那么它所做的就是返回ivar,那么您还会使用access or还是直接访问ivar,因为没有区别?为什么?

    编辑:我说的是在课堂上。

    3 回复  |  直到 15 年前
        1
  •  6
  •   AlBlue RACGAMERUP    15 年前

    直接使用ivar可以获得较小的性能优势。但是,为了避免混淆,我通常在ivar前面加上前缀uo,然后使用@synthesis foo=foo合成一个属性;这意味着我可以做[自foo]或foo。然后在我所指的代码中,它变得更加清晰。

    然而,优势并不多,一些人可能认为这是过早的优化。使用属性(或方法)将使您能够在以后发展类并更改ivar,但同时保持属性不变(例如使其成为计算属性)。它还允许子类重写您的属性并继续工作。

    (顺便说一句,在某些情况下,引用属性语法是有帮助的,例如在写入到ivar时。在这种情况下,对copy_retain的属性支持有助于释放上一个对象,并获得正确的retain/release调用顺序)

        2
  •  0
  •   Cinder6    15 年前

    你说的是课外活动还是室内活动?如果没有,则始终使用访问器。首先,objc中ivar的默认可见性是 @protected ,所以除非你明确提出 @public 使用存取器。除此之外,还可以使用访问器,因为您永远不知道您(或其他人)是否可能对类进行子类化,并对其进行足够的更改,以便使用访问器是必要的。

    如果你在课堂上谈论,你不会 使用访问器,但如果设置 @property 值,没有理由不使用点表示法,即使您正在合成所有内容。如果使用标准objc符号,例如 [myObject someVariable] ,则重复的嵌套消息可能会变得难以读取和混乱。

    实际上,访问器并没有变异器那么重要,因为变异器常常做不止一件事。使用getter(类外)和setter是一种很好的实践。

        3
  •  0
  •   mk12    15 年前

    我决定总是使用[自ivar],而不是直接使用ivar,即使我使用标准的objc括号符号,而不是点符号。唯一的例外是,如果[self ivar]是一个懒惰的加载访问器,并且我已经在方法中使用了它,并且我知道它已经初始化,我不想再检查在方法中使用它10次是否为零。