@property

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

基本介紹

  • 中文名:@property
  • 來源:C語言
  • 特點:與@synthesize配對使用
  • 參數分類:讀寫屬性、setter語意、原子性
簡介,格式,參數類型詳解,getter分析,setter分析,

簡介

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];
}
}

相關詞條

熱門詞條

聯絡我們