ChatGPT解决这个技术问题 Extra ChatGPT

@package 指令在 Objective-C 中的作用是什么?

有谁知道 @package 指令在 Objective-C 中的用途是什么?

在 Stephen Kochan 的 Programming in Objective-C 2.0 中我能找到的唯一提及是:

@package - 对于 64 位图像,可以在图像中实现类的任何位置访问实例变量

...

什么?这是否仅限于与图像一起使用,如在图片中?或者它是否意味着磁盘映像中的映像?

这是一个令人困惑的描述,并且在本书的其余部分都没有详细说明......

任何帮助都会很棒,谢谢!


Z
Zifre

@package 类似于 .NET 的 internal。这意味着该成员只能从定义它的框架中访问。

注意:在 32 位中,它的作用类似于 @public


所以,UIImage 是在 UIKit 中定义的,这意味着任何在 UIKit 中定义的类(或子类)都应该能够访问由@package 控制的变量?是这样吗?
是的,UIKit 中的任何东西都可以访问 UIKit 中的 @package 变量,但其他任何东西都不能
C
Community

Apple's documentation 对此进行了一些解释,但这里有更多详细信息……

@package 下声明的实例变量只能由同一框架、库或可执行文件中的代码访问。这与 C# 中的 internal 和 VB.NET 中的 Friend 最相似,但其他编程语言也有类似的保护方案(Java 有 package-private)。

例如,想象一个用于管理配方的框架 RecipeKit.framework

@interface Recipe : NSObject {
  @package;
    NSString *name;
  @private;
    NSArray *ingredients;
}
@end

@interface RecipeController : NSObject
@end

配方控制器将能够直接访问配方名称。您可以在 RecipeController 中编写类似的内容,因为它属于同一框架:

Recipe *recipe = [[[Recipe alloc] init] autorelease];
[recipe->name autorelease];
recipe->name = [@"The best ever recipe!" retain];

但是,如果您在链接到 RecipeKit 的应用程序中编写上述代码,则会导致编译器错误,因为您无权访问该变量。最后,当编译为 32 位时,在 @package 下声明的变量的行为就像它们在 @public 下声明一样,因此请注意此处的差异。

这个新特性很少受到关注,因为它只是打破类封装的另一种方式。一如既往,您最好只使用 @private 变量并为其设置访问器方法。事实上,有一段时间,Apple 试图通过在其模板中包含 @private 来推动这一点。使用 Objective-C 2.0 中的属性,坚持使用 @private 很容易,并且根据您的目标平台,您可以使用 leave out the instances variables entirely

图片

之前的一些答案有点不清楚的一件事是解决原始问题中的图像方面。实际上,@package变量描述中使用的图像一词与图形图像无关。相反,它指的是动态链接器能够加载的图像。通常可执行文件、框架和动态库都被链接器视为图像(尽管它们的处理方式略有不同)。您会不时看到单词 image 弹出。例如,一个常见的运行时错误是:“找不到 dyld 图像”。您还会在 dyld 的文档中发现散布在整个文档中的单词 image 的使用。通读 dyld 的手册页可以帮助澄清这个词的歧义。 UIImage 可以将变量声明为 @package,但它与图像无关,因为它与原始问题有关。


我想指出 Java 的包私有访问修饰符与 Objective-C 无关。 Java 包只是包含类的文件夹。 Objective-C 框架就是 Java 中的库。
您最了解“图像”是什么的地方之一是崩溃报告,该报告最后列出了“二进制图像”。
为什么在处理 @package 属性时 32 位和 64 位版本之间存在差异?