self.xxx與_xxx的區別

self.xxx(屬性)

屬性定義如下,在頭文件中定義則為公有屬性,可以在其他文件中訪問。在實現中定義則為私有,只能在.m文件中訪問。
@property (nonatomic, copy) NSString *name;
屬性可以使用點語法,如
self.name = @"pingping";
相當于調用實例方法,getter方法
NSString *name = self.name;
相當于調用實例方法,setter方法

_xxx (實例變量)

  • Objective-C原則上不允許從對象外訪問對象的實例變量的。
    @interface People : NSObject {
    NSUInteger age;
    NSString *name;
    }
  • 當上述實例變量定義在頭文件中,默認可視性是@protected,可以在類、子類、同一類型的其他實例中訪問,如people->age。若要改變訪問權限,可通過@private、@public指定。
  • 當上述實例變量定義在實現文件中,則對外部不可見,封裝層次更高,但是在同類的實例中仍可通過->訪問到。但是在子類中訪問不到父類的實例變量。

屬性與實例變量的聯系

從iOS5開始,當在頭文件中聲明一個屬性后,如name,編譯器會自動在實現文件中生成實例變量_name,而且不需要使用
@synthesize name = _name;
大部分情況下,_xxx或self.xxx達到的效果是一樣的,但還是有部分情況需要特別注意。接著往下看。

踩過的坑

1.懶加載時,如果不使用self.xxx是無法調用getter方法的,所以此時懶加載根本沒用上,你的指針都是nil的狀態。
2.要是用copy修飾屬性,當使用_xxx語法時,是直接操作的原對象地址,不會觸發copy操作,若你賦值的對象被修改了,那么你的屬性值也被修改了。
3.在初始化init以及dealloc的方法中,可以使用_xxx語法,但在其他情況
下使用self.xxx比較合理
4.在dealloc方法中,若要使用部分屬性,最好使用_xxx方式,若是該屬性是懶加載而你用點語法訪問,會造成crash。

參考

iOS 中關于self.xxx和_xxx訪問變量的區別
iOS之self.xxx與_xxx的區別

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容