属性的空访问方法

时间:2014-12-02 19:40:54

标签: ios

我是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自动创建访问器方法,所以这似乎没用。是否可以评论该方法?

1 个答案:

答案 0 :(得分:3)

请注意,您附加的代码在我看来是不好的做法,因为它们应该在标题中有一个只读属性,然后在类扩展中将其重新声明为 not readonly。

除此之外:

  
      
  1. 是否通常将属性放在.m文件中,即使它是在@interface中写的(对我来说属于.h文件)?
  2.   

如果标题中有readonly属性,并且您希望在实现文件中添加setter方法,供内部使用,则可以在类扩展中重新声明属性,并为您创建setter。因此,您不必自己编写设置器。

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

  
      
  1. 为什么有一个未实现的访问器方法(或者它是其他的东西?)。 @property自动创建访问器方法,所以这似乎没用。是否可以对方法进行评论?
  2.   

访问者方法实际上未实现,只是自动创建。 @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:

的setter方法

integerTwo :生成一个名为_integerTwo的实例变量,创建一个名为integerTwo的getter方法

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

只需实现自动生成的方法即可避免自动合成。如果你实现了所有自动生成的方法,你也必须自己合成实例变量。例如,如果我声明一个readonly属性然后覆盖自动创建的getter,我将不得不将@synthesize property=_property;放在我的实现文件的顶部,这样我就可以得到一个名为_property的实例变量。