iphone 開發中屬性 property 和 synthesize 權威的介紹

在Objective-c 2 .0中引入了 property 和 synthesize 爲方便存取 
 1 讓大家認識一下 property  and  synthesize  吧 
@property預編譯命令的作用是自動聲明屬性的setter和getter方法 
@synthesize也是一種新的編譯器功能,表示“創建該屬性的訪問器”
廢話少說~~ 下面更精彩哦~~~
下面我們來對比一下 有這兩個屬性和不用這兩個屬性的區別吧!!! 
----------------------------------
                              沒用之前
----------------------------------
 // Student.h 

#import <Cocoa/Cocoa.h> 


@interface Student : NSObject { 
NSString *name; 
NSString *studentNO; 


- (NSString*)name; 
- (NSString*)studentNO; 
- (void)setName:(NSString*)aName; 
- (void)setStudentNO:(NSString*)aStudentNO; 

@end 


// Student.h 

- (NSString*)name 

return name; 


- (NSString*)studentNO 

return studentNO; 


- (void)setName:(NSString*)aName 

[name autorelease]; 
name = [aName copy]; 


- (void)setStudentNO:(NSString*)aStudentNO 

[studentNO autorelease]; 
studentNO = [aStudentNO copy]; 



main裏面這麼用: 

Student *hayes = [[Student alloc] init]; 
[hayes setName:@"Hayes"]; 
[hayes setStudentNO:@"00000"]; 

NSLog(@"Name: %@", [hayes name]); 
NSLog(@"Student NO: %@", [hayes studentNO]); 
---------------------------------
用了之後 
---------------------------------
// Student.h 
#import <Cocoa/Cocoa.h> 

@interface Student : NSObject <NSCoding> { 
NSString *name; 
NSString *studentNO; 


@property(copy) NSString *name; 
@property(copy) NSString *studentNO; 

@end 

// Student.m 
#import "Student.h" 

@implementation Student 

@synthesize name; 
@synthesize studentNO; 

@end 


在main函數裏可以這麼調用: 

Student *hayes = [[Student alloc] init]; 
hayes.name = @"hayes"; 
hayes.studentNO = @"00001"; 

NSLog(@"%@", hayes.name); 
NSLog(@"%@", hayes. studentNO); 

-------------------------------------
精彩內容 馬上上演~~~
-------------------------------------
2 下面請允許我非常詳細的給大家介紹一下 property 後面括號中的屬性(nonatimic,retain,assign,copy,readonly,readwrite,)這些屬性主要事完成getter setter 的操作  
(這個很重要的哦 !!!很多初學者都在這裏迷惑哦~~~) 
------------------------------------------------
assign: 簡單的賦值  不會更改索引計數(Reference  counting)主要是對基本數據類型使用 eg:(NSInteger,CGFloat 和C語言的 int double float char  ...)如果使用對象類型的參數,需要開啓garbage collector
[現在的版本叫引用計數器 不同的版本不同的叫法  在mac編程和在iphone編程中的叫法也不同  諒解 諒解 ] 
retain: 釋放舊的對象 將舊對象的值賦予輸入對象 並將輸入對象的索引計數+1 ,主要應用與NSObject與其子類中,如果啓用了garbage collector 和assign 的作用一樣 
  1. - (void)setName:(NSString *)newName {  
  2.     if (name != newName) {  
  3.        [name release];  
  4.        name = [newName retain];  
  5.        // name’s retain count has been bumped up by 1  
  6.     }  
  7. }  
copy: 創建一個索引計數爲1的對象 釋放掉原來的對象 
readonly:  表示只讀屬性  只會生成getter方法 不會生成setter方法 
readwrite:設置可供訪問的級別 
nonatimic:非原子訪問,不加同步 ,多線程併發訪問提高性能 (對多線程的保護,防止在未寫完,被另一個線程讀取,造成數據錯誤)。
對copy 和retain的 解釋 上面的語言太抽象了 那麼請允許我在這裏對 copy 和 retain 的區別 作詳細的介紹

比如一個NSString 對象,地址爲0×1111 ,內容爲@”STR”

Copy 到另外一個NSString 之後,地址爲0×2222 ,內容相同,新的對象retain爲1 ,舊有對象沒有變化

retain 到另外一個NSString 之後,地址相同(建立一個指針,指針拷貝),內容當然相同,這個對象的retain值+1 

retain 是指針拷貝,copy 是內容拷貝  

下面分享一個網友的總結

 

一直以來個人覺得如果一個類是的property是readonly的那麼再指定其他的如assign/retain/copy這樣的屬性就實在是沒有什麼意義了。確實你想想既然都readonly了,肯定是沒有setter的,既然沒有setter那麼談assign/retain/copy又有什麼意義呢?所以一直以來我從來不對readonly的property加retain/copy屬性申明,默認assign就足夠了,simple is beautiful!

但是我現在發現我錯了,其實一直都有一種這種感覺,只是沒有找到100%的充分理由爲readonly加上retain/copy。但是假如你要在你的subclass改寫property,而加入你要改寫的是一個NSString,你像把這個屬性設置爲readwrite和copy,往往杯具就發生了,編譯時候可惡的warning 產生了,因爲copy和之前默認的assign明顯不相同啊!

終上,不論什麼時候,都要爲你的readonly的對象屬性加上合適的retain/copy申明。你現在不用,但不說明你將來就不會用,出來混遲早都要還的!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章