当您拥有属性时,理解对正则变量的需求



当你在类中创建一个变量时,你需要创建两个方法集,然后赋值并检索它。

但你不必对属性这样做,它已经为你做了。。。那么,为什么不把所有东西都作为一个属性,而不是正则变量呢?

我试着翻阅了一些文件,但什么也找不到。

你的问题不太准确。您描述了两种情况:

申报属性:

@interface Person : NSObject
{
  NSString *_name;
}
@property NSString *name;
@end

显式声明访问器方法:

@interface Person : NSObject
{
  NSString *_name;
}
- (NSString *)name;
- (void)setName:(NSString *)name;
@end

在第一种情况下(@properties),编译器将为您合成访问器方法实现。在第二种情况下(手动定义的访问器方法),您必须自己实现它们。此外,在第一种情况下,假设您部署到具有现代Objective-C运行时(即iOS或64位OS X)的系统,您不必显式声明实例变量来支持该属性,因为编译器也会为您这样做。(在"旧时代"或部署到32位Mac OS X时,即使对于@properties,也必须手动声明实例变量,并在实现中包含@synthesize语句)。

否则,它们在功能上是等效的。使用@property本质上只是一种方便、不那么冗长的方式来声明属性的访问器方法,并告诉编译器您希望为您实现它们。

如今,几乎从来没有理由手动声明访问器方法,而不是使用声明的@property。定义自定义访问器方法是另一回事。通常情况下,您想要做比简单地在访问器方法中设置/返回实例变量更复杂的事情,在这种情况下,必须定义自己的访问器方法。即使属性是使用@property声明的,也可以执行此操作。

至于使用裸实例变量而不是使用访问器方法,那就另当别论了。直接访问ivar有一个小的性能优势。也可以使它们真正地私有化。(通过将@properties放在实现中,可以将它们设置为"私有",但如果确定要在运行时调用访问器方法,则仍然可以在运行时这样做)。也就是说,在我看来,通常最好使用访问器方法,而不是直接进行ivar访问。

*:Declared@properties还允许您在声明中指定内存管理和原子性选项。这些相同的选项可以使用手动声明/定义的访问器方法进行更改,但由实现而非声明控制。(在使访问成为原子访问的情况下可能相当复杂)。这是@properties的另一个优势。最后,可以使用Objective-C运行时函数对@properties进行内省。这是一个相当高级的主题,对于绝大多数Objective-C程序和程序员来说并不重要。

最新更新