【问题标题】:Objective-C ivar visibility 'package'Objective-C ivar 可见性“包”
【发布时间】:2014-03-24 22:18:04
【问题描述】:

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

因此这段代码:

@interface MagicCarpet : NSObject
{

@protected
    NSString* _threadCount;
}

与此相同:

@interface MagicCarpet : NSObject
{
    NSString* _threadCount;
}

显然,还有一个“包”级别的可见性。我经常看到和使用“公共”、“私人”和“受保护”的可见性。 . .从未见过任何带有“包”的代码。它有什么作用?

【问题讨论】:

  • 没有。你不能“经常看到和使用‘公共’、‘私人’和‘受保护’的可见性”。因为 ivar 根本不应该在 .h 文件中(除非用于遗留代码)。使用公共 ivar 的属性,在 .m 文件中隐藏私有,尽可能避免受保护。
  • @BryanChen 我同意遵守现代 Objc 约定 - 这样就不会对 KVO 等感到意外。但问题的重点是关于“包”可见性的作用。

标签: objective-c


【解决方案1】:

来自Apple docs:

@package 是一个新的实例变量保护类,如@public@protected@package 实例变量的行为如下:

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

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

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

【讨论】:

  • 32 位表示旧运行时,64 位表示现代运行时。在现代运行时,它与 Java 中的 package 或 C# 中的 internal 基本相同
  • @package 对框架作者很有用。它对应用没有用。
  • @GregParker 说得通。谢谢!
猜你喜欢
  • 2012-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
相关资源
最近更新 更多