了解具有属性时对常规变量的需求

时间:2013-11-21 22:18:51

标签: ios objective-c

在类中创建变量时,需要创建2个方法集并获取赋值并检索它。

但你不必用属性来做这件事,它已经为你做了......所以为什么不把一切都变成属性而不是常规变量呢?

我试图查看一些文档但找不到任何内容。

1 个答案:

答案 0 :(得分:1)

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

声明的属性:

@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可以通过将它们放在实现中而变为“私有”,但是如果确定这样做,仍然可以在运行时调用访问器方法)。也就是说,in my opinion,使用访问器方法通常更好,而不是直接进行ivar访问。

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