如果 @protected 是默认值,为啥这个 ivar 需要 @protected?

Posted

技术标签:

【中文标题】如果 @protected 是默认值,为啥这个 ivar 需要 @protected?【英文标题】:Why does this ivar need @protected if @protected is the default?如果 @protected 是默认值,为什么这个 ivar 需要 @protected? 【发布时间】:2013-06-15 03:06:28 【问题描述】:
@interface AClass : SomeType 
@protected
    NSMutableArray* amINotAlreadyProtected; //?

如果@protected 是默认值,为什么这段代码需要@protected?这段代码是由一位非常有经验的程序员编写的,但我自己会省略说明符。

【问题讨论】:

@public@protected@private 来自一个属性是手动编码的时代(它们没有 @property 指令),并且 iVar 访问几乎是普遍的如果您需要完成工作。他们从不弃用它们,因为部分 Apple 框架仍在使用它们。 @CodaFi 好的。感谢您的信息。 @JoshCaswell 因为一位拥有大约 25 年经验的程序员在他的课堂上写了它。我自己会省略它。 @CodaFi 我想不同意你的观点,但后来我看到你是代表,并认为我比你更有可能是错的。 ^^ 因此,我将把它作为一个问题提出——@private/@protected/@public 是否仍然用于程序员不想用作属性的 ivars,这取决于子类是否继承?跨度> @Filip 我并没有说它还没有被使用,问题是 Apple 为我们提供了更新更好的工具来帮助加强封装规则。 iVar 访问在接口中自动公开(好吧,受保护),但是 @implementation 指令可以定义 iVars 的新功能违背了 @private 的目的。现代 ObjC 中不需要这些指令 【参考方案1】:

它来自一个你可能会看到的时代:

@interface Foo:Bar

     @private
     … ivars …
     @protected
     … ivars …

…
@end

也就是说,虽然@protected 是默认设置,但如果您已切换到其他变体之一并想要切换回来,则需要使用它。而且,是的,有一些理由(通常是不好的理由)来确保 ivar 声明顺序从发布到发布都得到保留。

除此之外,包含默认情况的关键字可确保学究气的灰胡子(如我)可以在声明中完全明确。

然而,像@property 这样的现代添加意味着不再需要这种恶作剧。

【讨论】:

谢谢。是的,我意识到在您在这里看到的情况下,我们需要@protected,因为我知道关键字@private 后面的所有变量都是私有的,除非切换回@protected。我问的问题并非如此,因为它前面没有@private@public【参考方案2】:

不需要关键字@protected,因为它是默认行为。

但是,无论如何,一些程序员倾向于使用它,以防经验不足的程序员在以后出现并且不知道这一点。还可以提到它增加了代码的可读性,以防有一些变量是受保护的以及其他私有或公共的。

【讨论】:

其实是有需要的。或者是。

以上是关于如果 @protected 是默认值,为啥这个 ivar 需要 @protected?的主要内容,如果未能解决你的问题,请参考以下文章

golang函数中的参数为啥不支持默认值

C语言,图中这个函数OK的值为啥是1,return 1和0有啥区别?

golang函数中的参数为啥不支持默认值

为啥 C# 局部变量应该直接赋值,即使它是默认值?

为啥我允许位置权限后不能设置状态值(如果我允许位置权限,默认值为当前位置)?

为啥我们不必在函数体中提供属性默认值?