在objective-c中通过“propertyname”与“self.propertyname”访问属性之间的区别?

时间:2011-03-09 20:13:11

标签: iphone objective-c memory-management properties accessor

在objective-c中通过“propertyname”与“self.propertyname”访问属性之间的内容是什么?你能否回答一下:

  1. 什么是最佳做法?
  2. 这两种方法如何影响内存管理(保留计数/一个内存管理职责)
  3. 任何其他优点/缺点
  4. 该方案的假设可以基于以下内容:

    标头文件

    @interface AppointmentListController : UITableViewController {
        UIFont *uiFont;
    }
    @property (nonatomic, retain) UIFont *uiFont;
    

    实施

    - (void)viewDidLoad {
        [super viewDidLoad];  
    
        uiFont = [UIFont systemFontOfSize:14.0];
        //VERSUS
        self.uiFont = [UIFont systemFontOfSize:14.0];
    

    感谢

2 个答案:

答案 0 :(得分:1)

使用propertyname只需访问实例变量。你负责对其内容进行自己的内存管理;没有为您执行保留或释放。

使用self.propertyname通常使用访问者。如果您使用的是@synthesize,则生成的访问者将按照@property行(您使用的示例retain中的说明处理内存管理,因此在设置新内容时会执行保留值为self.propertyname)。您也可以编写自己的访问者方法,根据需要进行管理。

更全面的解释是Memory Management Programming Guide。在这种情况下,最佳做法通常是使用@property@synthesize来处理变量,然后使用self.propertyname访问器来减轻自己的内存管理负担。该指南还建议您避免实施自定义访问者(即使用@property而不使用@synthesize)。

答案 1 :(得分:1)

另外一个注意事项 - 它对iPhone来说没那么有用,因为Cocoa Touch中没有绑定。但是如果您使用的是Cocoa,请注意以下几点:

键值编码。 KVC是整个Cocoa中使用的协议,最值得注意的是绑定。它将首先查找您的密钥的访问者,并且仅作为最后的手段直接访问数据。您可以通过实施访问器来缩短KVC的搜索速度,从而加快数据访问速度。

另请注意,如果直接设置实例变量,则以var = value的形式,Key-Value Observing将不会注意到更改,绑定对象将不会获得新值。