Objective c 目的-C ivar可见性';包装';

Objective c 目的-C ivar可见性';包装';,objective-c,Objective C,在Objective-C中创建ivar时,默认可见性为“protected”,这意味着可以从子类访问ivar。(如果在标题中声明) 因此,本守则: @interface MagicCarpet : NSObject { @protected NSString* _threadCount; } 与此相同: @interface MagicCarpet : NSObject { NSString* _threadCount; } 显然,还有一个“包”级别的可见性。我经常看到并使

在Objective-C中创建ivar时,默认可见性为“protected”,这意味着可以从子类访问ivar。(如果在标题中声明)

因此,本守则:

@interface MagicCarpet : NSObject
{

@protected
    NSString* _threadCount;
}
与此相同:

@interface MagicCarpet : NSObject
{
    NSString* _threadCount;
}
显然,还有一个“包”级别的可见性。我经常看到并使用“公共”、“私人”和“受保护”的可视性。从未见过任何带有“package”的代码。它有什么作用

@package
是一个新的实例变量保护类,类似于
@public
和受保护的<代码>@package实例变量的行为如下:

  • 32位的
    @public
  • @public
    64位,位于定义类的框架内
  • @private
    64位,在定义类的框架之外

    在64位中,
    @package
    ivar的实例变量符号不是 导出,因此任何从框架外部使用ivar的尝试 定义的类将因链接错误而失败


这个逻辑看起来很混乱,所以我一点也不奇怪
@package
不常用。

不。你不能“经常看到和使用‘公共’、‘私人’和‘受保护’的可视性”。因为ivar根本不应该在.h文件中(传统代码除外)。将属性用于公共ivar,在.m文件中隐藏私人文件,尽可能避免受保护。@BryanChen我同意遵守现代Objc约定-这样KVO就不会有什么意外了,等等。但问题的关键是“包”可见性的作用。32位表示旧运行时,64位表示现代运行时。在现代运行时中,它与Java中的
package
或C中的
internal
基本相同,#
@package
对框架作者很有用。它对应用程序没有用处。@GregParker说得通。谢谢