当前位置:  开发笔记 > 编程语言 > 正文

@package指令在Objective-C中做了什么?

如何解决《@package指令在Objective-C中做了什么?》经验,为你挑选了2个好方法。

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

我在Stephen-Cochan编写的Objective-C 2.0编程中唯一提到的是:

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

...

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

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

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



1> Zifre..:

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

注意:在32位中,它就像@public.



2> wbyoung..:

Apple的文档解释了这一点,但这里有更多详细信息......

声明的实例变量@package只能由来自相同框架,库或可执行文件的代码访问.这与internalC#和FriendVB.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,但它与图像无关,因为它与原始问题有关.


为什么在处理@package属性时32位和64位构建之间存在差异?
推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有