有谁知道 @package 指令在 Objective-C 中的用途是什么?
在 Stephen Kochan 的 Programming in Objective-C 2.0 中我能找到的唯一提及是:
@package - 对于 64 位图像,可以在图像中实现类的任何位置访问实例变量
...
什么?这是否仅限于与图像一起使用,如在图片中?或者它是否意味着磁盘映像中的映像?
这是一个令人困惑的描述,并且在本书的其余部分都没有详细说明......
任何帮助都会很棒,谢谢!
@package
类似于 .NET 的 internal
。这意味着该成员只能从定义它的框架中访问。
注意:在 32 位中,它的作用类似于 @public
。
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
,但它与图像无关,因为它与原始问题有关。