Objective-C中的@package指令是做什么的?

有没有人确切知道在Objective-C中使用@package指令?

Stephen Kochan在Objective-C 2.0编程中唯一可以find的是:

@package – 对于64位图像,可以在实现该类的图像中的任何位置访问实例variables

什么? 这是限制使用图像,如在图片? 或者这是否意味着像磁盘映像中的图像?

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

任何帮助将是真棒,谢谢!

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

注意:在32位它就像@public一样。

苹果的文档解释了这一点,但是这里有一些细节…

@package下声明的实例variables只能被来自同一个框架,库或者可执行文件的代码访问。 这与C#和VB.NET中的Friend最为相似,但是其他编程语言也有类似的保护机制(Java有package-private )。

例如,想象一个用于pipe理食谱的框架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的应用程序,那么会导致编译器错误,因为您无权访问该variables。 最后,当编译为32位时,在@package下声明的variables的行为好像是在@public下声明的@public ,所以请注意这里的差异。

这个新的function很less受到关注,因为这只是打破你课堂封装的一种方式。 像往常一样,你可能最好只使用@privatevariables,并为它们设置访问器方法。 事实上,一段时间,苹果试图通过在他们的模板中包含@private来推动这一点。 使用Objective-C 2.0中的属性,坚持使用@private非常简单,根据您的目标平台,可以完全忽略实例variables 。


图片

以前的一些答案有点不清楚的一件事就是从原始问题来处理图像的方面。 实际上,@ @packagevariables描述中使用的单词image与graphics图像无关。 相反,它指的是dynamic链接器能够加载的图像。 通常,可执行文件,框架和dynamic库都被链接器视为图像(尽pipe它们处理方式稍有不同)。 你会看到每隔一段时间就会popup一个单词图像。 例如,一个常见的运行时错误是:“找不到图像”。 你还会发现在整个dyld文档中散布的单词图像的使用。 通过dyld的手册页阅读可能有助于澄清这个词的含糊不清。 UIImage可能会将variables声明为@package ,但它与图像无关,因为它与原始问题有关。