Objective-C中的@property和@synthesize用法
Objective-C語言關鍵詞,@property與@synthesize配對使用。
功能:讓編譯器自動編寫一個與資料成員同名的方法宣告來省去讀寫方法的宣告。
如:
1、在標頭檔案中:
等效於在標頭檔案中宣告2個方法:
2、實現檔案(.m)中
等效於在實現檔案(.m)中實現2個方法。
以上等效的函式部分由編譯器自動幫開發者填充完成,簡化了編碼輸入工作量。
格式:
宣告property的語法為:@property (引數1,引數2) 型別 名字;
如:
其中引數主要分為三類:
讀寫屬性: (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、
等效程式碼:
2、
等效程式碼:
setter分析
1、
等效於:
- -(void)setThetest:(test *)newThetest {
- if (thetest!= newThetest) {
- [thetestrelease];
- thetest= [newThetest retain];
- }
- }
2、
等效於:
- -(void)setThetest:(test *)newThetest {
- if (thetest!= newThetest) {
- [thetest release];
- thetest= [newThetest copy];
- }
- }
nonatomic
如果使用多執行緒,有時會出現兩個執行緒互相等待對方導致鎖死的情況(具體可以搜下執行緒方面的注意事項去了解)。在沒有(nonatomic)的情況下,即預設(atomic),會防止這種執行緒互斥出現,但是會消耗一定的資源。所以如果不是多執行緒的程式,打上(nonatomic)即可
retain
程式碼說明
如果只是@property NSString*str; 則通過@synthesize自動生成的setter程式碼為:
如果是@property(retain)NSString*str; 則自動的setter內容為:
所有者屬性
我們先來看看與所有權有關係的屬性,關鍵字間的對應關係。
屬性值 關鍵字 所有權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 一致;只是可讀性更強一些。
相關文章
- Objective-C PropertyObject
- Objective-C Primer(3)Multiple arguments for one method, synthesize and dynamicObject
- @synthesize @dynamic 的區別
- DOM 中 Property 和 Attribute 的區別
- Objective-C中的self和super理解Object
- JavaScript 中 Property 和 Attribute 的區別詳解JavaScript
- @property中的變數與_變數
- Python 中的 property 屬性Python
- js中try和catch的用法JS
- C#中?和??及?:的用法C#
- JS中的!=、== 、!==、=== 的用法和區別JS
- JS中的!=、== 、!==、===的用法和區別。JS
- property和attribute的區別?
- attribute和property的區別
- Objective-C中的CopyObject
- Objective-C中的@dynamicObject
- Objective-C中的BlockObjectBloC
- linux中#和## 用法Linux
- 理解 Kotlin 中的屬性(property)Kotlin
- 淺談 Swift 中的屬性(PropertySwift
- 淺談 Swift 中的屬性(Property)Swift
- js中!和!!的區別與用法JS
- Java 中 this 和 super 的用法詳解Java
- React中的Context和Portals用法ReactContext
- sql中union和union all的用法SQL
- Java中ThreadLocal的用法和原理Javathread
- JS中apply和call的用法JSAPP
- TCanvas中SaveDC和RestoreDC的用法 (轉)CanvasREST
- SQL中IN和EXISTS用法的區別SQL
- oracle中的exists和not exists和in用法詳解Oracle
- Objective-C 中的協議(@protocol)和介面(@interface)的區別Object協議Protocol
- Objective-C 中的NSLogObject
- PHP中MySQL、MySQLi和PDO的用法和區別PHPMySql
- JQuery中html()和val()的用法區別jQueryHTML
- React 中 getDerivedStateFromProps 的用法和反模式React模式
- Python中__init__的用法和理解Python
- oracle中的CURRVAL和NEXTVAL用法Oracle
- Lombok中@Builder和@SuperBuilder註解的用法LombokUI