2014-12-02 20 views
0

我是iOS新手,想了解一些需要转换为Java的Objective C代码。属性的空存取方法

在.h文件中有很多方法声明是这样的:

@interface SomeClass : NSObject<NSCoding> 
    // Some score 
    - (int)score; 
@end 

,并在.m文件有:

@interface SomeClass() 

@property(nonatomic) int score; 

@end 

但声明存取方法得分在SomeClass中从来没有在任何地方实现。

所以我的问题是:

  1. 是它通常把性能的.m文件,即使它里面写@interface(这对我来说是属于.h文件)

  2. 为什么有一个未实现的访问器方法(或者是别的吗?)。 @property自动创建访问器方法,所以这似乎是无用的。只是为了让人能评论该方法吗?

回答

3

只是注意,你连接的代码是在我看来不好的做法,因为他们应该在头一个只读属性,然后就重新声明其作为类扩展只读。

这一边:

  1. 是它通常把性能的.m文件,即使它里面写@interface(这对我来说是属于.h文件)?

如果在头一个只读属性,并要添加一个setter方法在实现文件中,供内部使用,那么你可以重新声明属性的一类延伸和setter方法是为你创造。因此,你不必自己编写二传手。

在你的情况,程序员有一个属性与getter和setter,但只想公开暴露getter方法。

  1. 为什么有一个未实现的存取方法(或者是别的什么?)。 @property自动创建访问器方法,所以这似乎是无用的。只是为了让人能评论该方法吗?

访问器方法实际上并未实现,它只是自动创建的。 @property声明与最新版本的LLVM一起经历一个称为自动合成的过程。这种自动合成将查看@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

integerThree getter方法:生成一个名为_integerThree的实例变量,创建一个名为getter方法myIntegerThree

您可以通过只实现自动生成的方法避免了autosynthesis 。如果你实现了所有的自动生成方法,你也必须自己综合实例变量。例如,如果我声明只读属性,然后重写自动创建的获取器,则必须将@synthesize property=_property;置于实现文件的顶部,以便我可以获取名为_property的实例变量。