日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OC 实例变量(instance var)与属性(@property)的关系 isa指针

發布時間:2024/4/14 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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
  • @property?(getter=isFinished)?BOOL?finished;??
  • - setter=,指定新的setter方法名。

    ?

    @synthesize name = custom_name:將實例變量_name名稱換成custom_name

    @synthesize?name:將實例變量_name名稱換成name

    注意:@synthesize不會影響@property產生的setter和getter方法的名稱

    ?

    setter和getter方法什么時候被調用?

    例如,屬性聲明如下

    [objc]?view plaincopy
  • @interface?Person?:?NSObject??
  • @property?NSString?*firstName;?//?atomic,?assign,?readwrite?(default)??
  • @end?
  • 有2種方法:

    (1)顯示調用(發送消息)

    [objc]?view plaincopy
  • [somePerson?firstName];?//?Call?getter?method??
  • [somePerson?setFirstName:?@"Johnny"];?//?Call?setter?method??
  • (2)隱式調用(點語法)

    [objc]?view plaincopy
  • NSString?*firstName?=?somePerson.firstName;?//?Call?getter?method??
  • somePerson.firstName?=?@"Johnny";?//?Call?setter?method??
  • 如果在實例方法中直接使用實例變量,則不會調用對應的setter和getter方法,例如

    [objc]?view plaincopy
  • -?(void)someMethod??
  • {??
  • ?????NSString?*myString?=?_firstName;?//?Won't?call?getter?method??
  • ?????_firstName?=?@"A?string";?//?Won't?call?setter?method??
  • }??
  • 顯然直接使用實例變量會有風險,如內存泄露、循環引用等。最好訪問實例變量,都通過@property產生的setter和getter方法。

    ?

    轉載于:https://www.cnblogs.com/oc-bowen/p/5016901.html

    總結

    以上是生活随笔為你收集整理的OC 实例变量(instance var)与属性(@property)的关系 isa指针的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。