有没有人确切知道Objective-C中@package指令的用途?
我在Stephen-Cochan编写的Objective-C 2.0编程中唯一提到的是:
@package - 对于64位图像,可以在实现该类的图像中的任何位置访问实例变量
...
什么?这是否仅限于与图像一起使用,如图片中所示?或者它是否意味着像磁盘映像中的图像?
这是一个令人困惑的描述,并没有在本书的其余部分详述....
任何帮助都会很棒,谢谢!
@package
类似于internal
.NET.这意味着只能从定义它的框架访问该成员.
注意:在32位中,它就像@public
.
Apple的文档解释了这一点,但这里有更多详细信息......
声明的实例变量@package
只能由来自相同框架,库或可执行文件的代码访问.这与internal
C#和Friend
VB.NET中的类似,但其他编程语言也有类似的保护方案(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
非常简单,根据您所针对的平台,您可以完全忽略实例变量.
以前的一些答案有点不清楚的一件事是解决原始问题的图像方面.事实上,@package
变量描述中使用的单词图像与图形图像无关.相反,它指的是动态链接器能够加载的图像.通常,可执行文件,框架和动态库都被链接器视为图像(尽管它们的处理方式略有不同).你会看到每隔一段时间弹出一下这个词.例如,常见的运行时错误是:"未找到dyld图像".您还会发现使用分散在整个文档中的图像一词dyld
.阅读手册页dyld
有助于清除这个词的含糊之处.UIImage
可以将变量声明为@package
,但它与图像无关,因为它与原始问题有关.