OC 实例变量(instance var)与属性(@property)的关系 isa指针
實例變量(instance var)與屬性(@property)的關系
?
? ? ? Objective-C 2.0之后,聲明一個@property?name自動產生一個實例變量,名為_name,因此省去實例變量和屬性重復輸入的麻煩。而使用@synthesize可以改變_name名稱。@property和@synthesize不必成對出現。
?
@property name:指示編譯器自動合成setter和getter方法,setter方法名即setName,而getter方法名即name。@property后面的關鍵字,例如readonly、readwrite、retain、nonatomic、copy等,指定如何生產setter和getter方法。這些屬性修飾符大致分為四類:
(1)可變性 (Mutability)
- readonly,只生成getter方法,沒有setter方法
- readwrite,是默認的
(2)內存管理 (Memory management)
- assign,是默認的,適用于內置類型(int, bool等)或者代理對象(delegate),不存在引用計數機制。
- retain,只適用于對象,不適用內置類型(int, bool等)。當使用setter方法時,將對象的引用計數加1。
- copy,使用setter方法時,拷貝一個對象,即在內存中產生新對象,而不是把原來的對象的引用計數加1。顯然,復制出來的新對象的引用計數為1。
(3)并發性 (Concurrency)
- nonatomic,訪問屬性非原子性,一般單線程聲明nonatomic,考慮到速度問題。多線程程序就不要使用nonatomic。
- atomic,訪問屬性原子性,與nonatomic相反。
(4)API控制 (API control)
- getter=newGetterName,指定新的getter方法名,一般重新改寫BOOL實例變量的getter名。例如
[objc]?view plaincopy- setter=,指定新的setter方法名。
?
@synthesize name = custom_name:將實例變量_name名稱換成custom_name
@synthesize?name:將實例變量_name名稱換成name
注意:@synthesize不會影響@property產生的setter和getter方法的名稱
?
setter和getter方法什么時候被調用?
例如,屬性聲明如下
[objc]?view plaincopy有2種方法:
(1)顯示調用(發送消息)
[objc]?view plaincopy(2)隱式調用(點語法)
[objc]?view plaincopy如果在實例方法中直接使用實例變量,則不會調用對應的setter和getter方法,例如
[objc]?view plaincopy顯然直接使用實例變量會有風險,如內存泄露、循環引用等。最好訪問實例變量,都通過@property產生的setter和getter方法。
?
轉載于:https://www.cnblogs.com/oc-bowen/p/5016901.html
總結
以上是生活随笔為你收集整理的OC 实例变量(instance var)与属性(@property)的关系 isa指针的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL Server---触发
- 下一篇: 关于文件存储