我是iOS的新手,并试图了解我需要转换为Java的一些Objective C代码。
在.h文件中有很多方法声明如下:
@interface SomeClass : NSObject<NSCoding>
// Some score
- (int)score;
@end
并在.m文件中有:
@interface SomeClass()
@property(nonatomic) int score;
@end
但是在SomeClass中声明的访问者方法得分永远不会在任何地方实现。
所以我的问题是:
将属性放在.m文件中是不正常的,即使它是在@interface中写的(对我来说属于.h文件)
为什么有一个未实现的访问器方法(或者其他的东西?)。 @property自动创建访问器方法,所以这似乎没用。是否可以评论该方法?
答案 0 :(得分:3)
请注意,您附加的代码在我看来是不好的做法,因为它们应该在标题中有一个只读属性,然后在类扩展中将其重新声明为 not readonly。
除此之外:
- 是否通常将属性放在.m文件中,即使它是在@interface中写的(对我来说属于.h文件)?
醇>
如果标题中有readonly属性,并且您希望在实现文件中添加setter方法,供内部使用,则可以在类扩展中重新声明属性,并为您创建setter。因此,您不必自己编写设置器。
在你的情况下,程序员有一个带有getter和setter的属性,但只想公开公开getter方法。
- 为什么有一个未实现的访问器方法(或者它是其他的东西?)。 @property自动创建访问器方法,所以这似乎没用。是否可以对方法进行评论?
醇>
访问者方法实际上未实现,只是自动创建。 @property声明,带有最新版本的LLVM,通过一个名为autosynthesis的过程。这个自动合成将查看@property声明,并为它生成相应的setter和accessor方法。
程序员只是想公开公开getter方法,这就是为什么他们把它放在公共类接口中。
以下是自动生成的getter和setter的示例:
@interface MyClass ()
@property (nonatomic) int integerOne;
@property (nonatomic, readonly) int integerTwo;
@property (nonatomic, readonly, getter = myIntegerThree) int integerThree;
@end
这些将做的如下:
integerOne :生成名为_integerOne
的实例变量,创建名为integerOne
的getter方法并创建名为setIntegerOne:
integerTwo :生成一个名为_integerTwo
的实例变量,创建一个名为integerTwo
的getter方法
integerThree :生成一个名为_integerThree
的实例变量,创建一个名为myIntegerThree
的getter方法
只需实现自动生成的方法即可避免自动合成。如果你实现了所有自动生成的方法,你也必须自己合成实例变量。例如,如果我声明一个readonly属性然后覆盖自动创建的getter,我将不得不将@synthesize property=_property;
放在我的实现文件的顶部,这样我就可以得到一个名为_property
的实例变量。