@property

@property,是一種計算機語言,使用特點是與@synthesize配對使用。

簡介

Objective-C語言關鍵字,與@synthesize配對使用。xcode4.5以及以後的版本,@synthesize可以省略

下面以 Person 類為例:

在. h 檔案中:

@interface Person : NSObject

{

NSString * _name;

NSString * _sex;

NSInteger _age;

}

@property NSString * name;

@property NSString * sex;

@property NSInteger age;

表示聲明了三個屬性: name,sex,age, 默認生成3個對應的 setter 和 getter 方法

在. m 檔案中:

@implementation Person

@synthesize name = _name;

@synthesize sex = _sex;

@synthesize age = _age;

@end

表示實現3個 setter 和 getter 方法,其中 name = _name 表示說在 getter 和 setter 方法中操作的實例變數是_name,如果省略了_name,_age,_sex, 那么會在. h 檔案中生成同名的實例變數 name,sex,age(注意:這裡並沒有下劃線),此時生成的 setter 和 getter 方法所操作的實例變數是 name,sex,age, 所以_name,_sex,_age 並沒有被操作.

在 ios5.0後,@synthesize也可以省略不寫,此時在. h 檔案中只寫@ property 即可,編譯器會自動生成相應的實例變數,實例變數的名字是屬性名稱前加下劃線.

格式

聲明property的語法為:

@property (參數1,參數2) 類型 名字;

如:

@property(nonatomic,retain) UIWindow *window;

其中參數主要分為三類:

讀寫屬性: (readwrite/readonly/setter = /getter = )

setter語意:(strong/weak/assign/retain/copy)

原子性: (atomicity/nonatomic)

各參數意義如下:

readwrite

產生setter\getter方法

readonly

只產生簡單的getter,沒有setter, 默認的讀寫屬性.

setter =

指定生成setter方法的名字

getter =

指定生成getter方法的名字

assign

默認類型,setter方法直接賦值,而不進行retain操作, 適用於基本數據類型, 對對象類型, 不會發生引用計數變化.

retain

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

copy

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

atomic

保證多執行緒訪問下的安全, 但浪費系統資源, 原子性控制的默認設定.

nonatomic

禁止多執行緒,變數保護,提高性能

strong與weak是由ARC新引入的對象變數屬性.

強引用與弱引用的廣義區別:
強引用也就是我們通常所講的引用,其存亡直接決定了所指對象的存亡。如果不存在指向一個對象的引用,並 且此對象不再顯示列表中,則此對象會被從記憶體中釋放。
弱引用除了不決定對象的存亡外,其他與強引用相同。即使一個對象被持有無數個若引用,只要沒有強引用指 向他,那麽其還是會被清除。沒辦法,還是 “強哥” 有面子。

簡單講strong等同retain
weak比assign多了一個功能,當對象消失後自動把指針變成nil,好處不言而喻。

參數類型詳解

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

getter分析

1、 @property(nonatomic,retain)test* thetest;

@property(nonatomic ,copy)test* thetest;

等效代碼:

-(test*)thetest

{

return thetest;

}

2、@property(retain)test* thetest;

@property(copy)test* thetest;

等效代碼:

-(test*)thetest

{

[thetest retain];

return [thetest autorelease];

}

setter分析

1、

@property(nonatomic,retain)test* thetest;

@property(retain)test* thetest;

等效於:

-(void)setThetest:(test *)newThetest {

if ( thetest!= newThetest) {

[ thetest release];

thetest= [newThetest retain];

}

}

2 @property(nonatomic,copy)test* thetest;

@property(copy)test* thetest;

等效於:

-(void)setThetest:(test *)newThetest {

if ( thetest != newThetest) {

[ thetest release];

thetest= [newThetest copy];

}

}

相關詞條

熱門詞條

聯絡我們