在Objective-C中,与.m文件相反,在头文件中定义内容(例如属性或方法)有什么区别?我听说它与将其公开或私有有关,但我不确定细节。如果是这样,这是否与Java中的公共方法和私有方法相同?
我精通Java,因此可以将Objective-C与Java关联的任何方式都会有所帮助。
谢谢
编辑:澄清一下,假设我有一个名为“ CalculatorBrain”的类(如果这是适当的术语),以下内容之间有什么区别(请注意NSMutableArray * operandStack:
在.m文件中:
@interface CalculatorBrain()
@property (nonatomic, strong) NSMutableArray *operandStack;
@end
Run Code Online (Sandbox Code Playgroud)
与.h文件中的:
@interface CalculatorBrain : NSObject
@property (nonatomic, strong) NSMutableArray *operandStack;
@end
Run Code Online (Sandbox Code Playgroud)
在定义NSMutableArray *的地方有什么区别?
小智 4
好吧,在您的澄清之后,我将尝试解释那里发生的事情。
\n\n假设您的头文件 (.h) 中有以下内容:
\n\n@interface Foobar {\n}\n@property (readonly) int numberOfPies;\n@end\nRun Code Online (Sandbox Code Playgroud)\n\n这定义了类的公共接口。虽然我在那里说了“公共”,但我想完全清楚地表明,Objective-C 并不具有与 Java 或 C++ 相同的可见性概念(它使用它作为实例变量,但那是最远的)据我所知)。我还将“类别”加粗,因为即将出现一个重要的区别。我想指出的另一件事是该类公开声明了 to numberOfPies,readonly因为这也很重要。
现在,让我们看一下该类的实现 (.m) 文件:
\n\n@interface Foobar ()\n- (void) doSomething;\n@property (readwrite) numberOfPies;\n@end\n\n@implementation Foobar\n@synthesize numberOfPies;\n\n- (void) doSomething {\n NSLog(@"Doing something");\n}\n\n@end\nRun Code Online (Sandbox Code Playgroud)\n\n看看@interface Foobar ()\xe2\x80\x94 这开始了一个类扩展。它不是一个类声明。这些有时也被称为私有类别、匿名类别或类延续(根据下面评论中的 zneak),但重要的是要知道它们基本上是一种类别(我已链接到 Apple\有关类别的文档)。这些本质上定义了附加的方法和属性,并且可以应用于任何类。它们在这里用于为类提供相当于私有接口的内容(因此称为“私有类别”)。
继续,现在我们将比较numberOfPies类和类别之间的属性。如果您还没有注意到差异,那就是:类将其公开为readonly,类别扩展它并将其置于readwrite实现内部。如果发生这种情况,在综合属性时,Obj-C 将同时包含 getter 和 setter。这里重要的是,除了你的财产是readonly或之外readwrite,你的财产不能改变。它不能assign在类和copy类别中具有该属性。这基本上还可以让您为属性定义一个方便的私有设置器。
这里需要注意的一件重要事情是,该类别中绝对没有任何内容是真正私有的。尽管编译器会在类的实现文件之外向您发出警告,但没有什么可以阻止您doSomething向对象发送消息。Foobar
接下来,您将获得标准实施。这包括匿名类别中方法的实现。
\n| 归档时间: |
|
| 查看次数: |
1828 次 |
| 最近记录: |