Ios 属性的空访问器方法
我是iOS新手,试图理解一些需要翻译成Java的目标C代码 在.h文件中,有许多方法声明如下:Ios 属性的空访问器方法,ios,Ios,我是iOS新手,试图理解一些需要翻译成Java的目标C代码 在.h文件中,有许多方法声明如下: @interface SomeClass : NSObject<NSCoding> // Some score - (int)score; @end 但是在SomeClass中声明的访问器方法分数从未在任何地方实现 因此,我的问题是: 是否通常将属性放在.m文件中,即使它写在@interface中(对我来说,它属于.h文件) 为什么会有一个未实现的访问器方法(或者是其他方
@interface SomeClass : NSObject<NSCoding>
// Some score
- (int)score;
@end
但是在SomeClass中声明的访问器方法分数从未在任何地方实现
因此,我的问题是:
请注意,在我看来,您附加的代码是一种糟糕的做法,因为它们应该在头中有一个readonly属性,然后在类扩展中将其重新声明为notreadonly 除此之外:
@interface MyClass ()
@property (nonatomic) int integerOne;
@property (nonatomic, readonly) int integerTwo;
@property (nonatomic, readonly, getter = myIntegerThree) int integerThree;
@end
这些措施的作用如下:
integerOne:生成名为\u integerOne
的实例变量,创建名为integerOne
的getter方法,并创建名为setIntegerOne:
integerTwo:生成名为\u integerTwo
的实例变量,创建名为integerTwo的getter方法
integerThree:生成名为\u integerThree
的实例变量,创建名为myIntegerThree
您可以通过实现自动生成的方法来避免自动合成。如果您实现了所有自动生成的方法,那么您还必须自己合成实例变量。例如,如果我声明了一个只读属性,然后重写了自动创建的getter,那么我必须将@synthesis property=\u属性代码>在我的实现文件的顶部,这样我就可以得到一个名为\u property
的实例变量。请注意,我认为您附加的代码是不好的做法,因为它们应该在头中有一个readonly属性,然后在类扩展中将其重新声明为not readonly
除此之外:
即使属性写在@interface(对我来说,它属于.h文件)中,也通常将属性放在.m文件中吗
如果在头中有一个只读属性,并且希望在实现文件中添加一个setter方法供内部使用,则可以在类扩展中重新声明该属性,然后将为您创建setter。因此,您不必自己编写setter
在您的例子中,程序员有一个带有getter和setter的属性,但只想公开getter方法
为什么会有一个未实现的访问器方法(或者是其他方法?)@属性自动创建访问器方法,因此这似乎是无用的。这是否只是为了让人们可以对该方法进行评论
访问器方法实际上并不是未实现的,它只是自动创建的。带有最新版本LLVM的@property声明将通过一个称为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:生成名为\u integerOne
的实例变量,创建名为integerOne
的getter方法,并创建名为setIntegerOne:
integerTwo:生成名为\u integerTwo
的实例变量,创建名为integerTwo的getter方法
integerThree:生成名为\u integerThree
的实例变量,创建名为myIntegerThree
您可以通过实现自动生成的方法来避免自动合成。如果您实现了所有自动生成的方法,那么您还必须自己合成实例变量。例如,如果我声明了一个只读属性,然后重写了自动创建的getter,那么我必须将@synthesis property=\u属性代码>在我的实现文件的顶部,这样我就可以得到一个名为\u property
的实例变量。请注意,我认为您附加的代码是不好的做法,因为它们应该在头中有一个readonly属性,然后在类扩展中将其重新声明为not readonly