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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Objective-C中的@property和@synthesize用法

發布時間:2023/12/10 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Objective-C中的@property和@synthesize用法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

@代表“Objective-C”的標志,證明您正在使用Objective-C語言

?

Objective-C語言關鍵詞,@property與@synthesize配對使用。

?

功能:讓編譯好器自動編寫一個與數據成員同名的方法聲明來省去讀寫方法的聲明。

?

如:

1、在頭文件中:

C代碼??
  • @property?int?count;??
  • 等效于在頭文件中聲明2個方法:

    C代碼??
  • -?(int)count;??
  • -(void)setCount:(int)newCount;??
  • ?

    2、實現文件(.m)中

    C代碼??
  • @synthesize?count;??
  • 等效于在實現文件(.m)中實現2個方法。

    C代碼??
  • -?(int)count??
  • {??
  • ????return?count;??
  • }??
  • -(void)setCount:(int)newCount??
  • {??
  • ????count?=?newCount;??
  • }??
  • ??

    以上等效的函數部分由編譯器自動幫開發者填充完成,簡化了編碼輸入工作量。

    ?

    格式:

    ?

    聲明property的語法為:@property (參數1,參數2) 類型 名字;

    ?

    如:

    C代碼??
  • @property(nonatomic,retain)?UIWindow?*window;??
  • ?

    其中參數主要分為三類:

    ?

    讀寫屬性: (readwrite/readonly)

    setter語意:(assign/retain/copy)

    原子性: (atomicity/nonatomic)

    ?

    各參數意義如下:

    ?

    readwrite:?產生setter\getter方法

    readonly:?只產生簡單的getter,沒有setter。

    assign:?默認類型,setter方法直接賦值,而不進行retain操作

    retain:?setter方法對參數進行release舊值,再retain新值。

    copy:?setter方法進行Copy操作,與retain一樣

    nonatomic:?禁止多線程,變量保護,提高性能

    ?

    參數類型

    參數中比較復雜的是retain和copy,具體分析如下:

    ?

    getter 分析

    ?

    1、

    C代碼??
  • @property(nonatomic,retain)test*?thetest;??
  • @property(nonatomic?,copy)test*?thetest;??
  • 等效代碼:

    C代碼??
  • -(void)thetest??
  • {??
  •   return?thetest;??
  • }??
  • ?

    2、

    C代碼??
  • @property(retain)test*?thetest;??
  • @property(copy)test*?thetest;??
  • 等效代碼:

    C代碼??
  • -(void)thetest??
  • {??
  • ????[thetest?retain];??
  • ????return?[thetest?autorelease];??
  • }??
  • ?

    setter分析

    ?

    1、

    C代碼??
  • @property(nonatomic,retain)test*?thetest;??
  • @property(retain)test*?thetest;??
  • 等效于:

    C代碼??
  • -(void)setThetest:(test?*)newThetest?{??
  • ????if?(thetest!=?newThetest)?{??
  •   ??????[thetestrelease];??
  •   ??????thetest=?[newThetest?retain];??
  • ????}??
  • }??
  • ??

    ?2、

    C代碼??
  • @property(nonatomic,copy)test*?thetest;??
  • @property(copy)test*?thetest;??
  • ?等效于:

    C代碼??
  • -(void)setThetest:(test?*)newThetest?{??
  • ????if?(thetest!=?newThetest)?{??
  •   ??????[thetest?release];??
  •   ??????thetest=?[newThetest?copy];??
  • ????}??
  • }??
  • ?

    nonatomic

    如果使用多線程,有時會出現兩個線程互相等待對方導致鎖死的情況(具體可以搜下線程方面的注意事項去了解)。在沒有(nonatomic)的情況下,即默認(atomic),會防止這種線程互斥出現,但是會消耗一定的資源。所以如果不是多線程的程序,打上(nonatomic)即可

    ?

    retain

    代碼說明

    如果只是@property NSString*str;?則通過@synthesize自動生成的setter代碼為:

    C代碼??
  • -(void)setStr:(NSString*)value{??
  • ????str=value;??
  • }??
  • ??

    如果是@property(retain)NSString*str;?則自動的setter內容為:

    C代碼??
  • -(void)setStr:(NSString*)v{??
  • ????if(v!=str){??
  • ????????[str?release];??
  • ????????str=[v?retain];??
  • ????}??
  • }??
  • ?

    ?

    所有者屬性

    我們先來看看與所有權有關系的屬性,關鍵字間的對應關系。

    屬性值 關鍵字 所有權

    strong__strong
    weak__weak
    unsafe_unretained__unsafe_unretained
    copy__strong
    assign__unsafe_unretained
    retain__strong

    strong

    該屬性值對應 __strong 關鍵字,即該屬性所聲明的變量將成為對象的持有者。

    weak

    該屬性對應 __weak 關鍵字,與 __weak 定義的變量一致,該屬性所聲明的變量將沒有對象的所有權,并且當對象被破棄之后,對象將被自動賦值nil。

    并且,delegate 和 Outlet 應該用 weak 屬性來聲明。同時,如上一回介紹的 iOS 5 之前的版本是沒有 __weak 關鍵字的,所以 weak 屬性是不能使用的。這種情況我們使用 unsafe_unretained。

    unsafe_unretained

    等效于__unsafe_unretaind關鍵字聲明的變量;像上面說明的,iOS 5之前的系統用該屬性代替 weak 來使用。

    copy

    與 strong 的區別是聲明變量是拷貝對象的持有者。

    assign

    一般Scalar Varible用該屬性聲明,比如,int, BOOL。

    retain

    該屬性與 strong 一致;只是可讀性更強一些。

    轉載于:https://www.cnblogs.com/facial/p/4388484.html

    總結

    以上是生活随笔為你收集整理的Objective-C中的@property和@synthesize用法的全部內容,希望文章能夠幫你解決所遇到的問題。

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