@property你們都知道可以根據給定的內存管理語意以及原子性和非原子性的設置自動合成對應的setter和getter方法。可是@property具體在背後除此以外還幹了什麼就不必定了解了。而因爲這些不瞭解所帶來的開發中的困惑和卡頓也尤其使人不快,筆者在寫這篇博客的時候也遇到了一樣的這些問題,如今查明這些疑難雜症,將其一一破解。程序員
@property的發展歷程經歷兩個階段,當@property語法糖剛被引入進Objc時,@property是做爲生成set和get方法的語法糖而存在的,僅在.h文件中自動生成accessor的方法聲明,程序員仍是要寫出實例變量,配合@synthesize來指出要合成存取方法的變量。第二個階段是,@property變得更加的自動化,除生成accessor方法外,還能夠直接完成之前@synthesize的功能,而且生成實例變量。objective-c
可是這引起了一些困惑,這些困惑蘋果的官方文檔說的也不甚清楚。繼承
由編譯器合成的實例變量的繼承範圍可見性是什麼?內存
對於繼承父類中聲明爲@protected和@private的變量而言,在子類中訪問這些變量會被明確告知變量是private的,沒法訪問。可是對於在子類中用_iva的方式訪問父類自動合成出來的實例變量,只是簡單的提示變量不存在。因此對於合成出來的實例變量是無法肯定其繼承範圍的,子類在繼承父類時,只能經過訪問accessor方法來訪問這些實例變量。開發
編譯器將這些實例變量合成在哪裏呢?文檔
精確的位置並無查到,可是肯定的是合成在出現@synthesize的文件,也就是.m文件中,對於在@implementation synthesize的變量和多是做爲類的私有變量聲明在.m文件中了。get
要注意的問題:編譯器
當你複寫了get和set方法以後@synthesize就不會起做用了,這也就意味着你的類不會自動生成出來的實例變量了。你若是要複寫set get方法你就必需要本身聲明實例變量。博客
參考資料:it