@property

@property

@property是Objective-C語言關鍵詞,與@synthesize配對使用。從iOS5.0(xcode4.5)以及之後的版本,@synthesize能夠省略。css

在 ios5.0後,@synthesize省略不寫,此時在. h 文件中只寫@ property 便可,編譯器會自動生成相應的實例變量,實例變量的名字是屬性名稱前加下劃線.如 name = _name; 
@property會對對應的變量默認生成相應的getter和setter方法,name = _name;表示在getter和setter中使用的變量名都爲_name。getter和setter方法能夠重寫。html

聲明property的語法爲: 
@property (參數1,參數2) 類型 名字; 
好比: 
@property(nonatomic,copy) NSString *string; 
其中參數主要分爲三類: 
- 讀寫屬性: (readwrite/readonly) 
- setter語意:(assign/retain/copy) 
- 原子性: (atomicity/nonatomic)ios

各參數意義以下:

  • readwrite 
    產生setter\getter方法
  • readonly 
    只產生簡單的getter,沒有setter。
  • assign 
    默認類型,setter方法直接賦值,而不進行retain操做
  • retain 
    setter方法對參數進行release舊值,再retain新值。
  • copy 
    setter方法進行Copy操做,與retain同樣
  • nonatomic 
    禁止多線程,變量保護,提升性能
  • atomic 
    容許多線程 

參數中比較複雜的是retain和copy的使用

getter:

一、 xcode

@property(nonatomic,retain)NSObject *ob; @property(nonatomic ,copy)NSObjejct *ob; 

等效代碼:ruby

-(NSObject *)ob { return ob; } 

二、多線程

@property(retain)NSObject *ob; @property(copy)NSObject *ob; 

等效代碼:app

-(NSObject *)ob { [ob retain]; return [ob autorelease]; //非ARC中 } 

setter:

一、性能

@property(nonatomic,retain)NSObject *ob; @property(retain)NSObject *ob;

等效於:ui

-(void)setOb:(NSObject *)newOb { if ( ob != newOb ) { [ob release]; //非ARC // ob = nil; //ARC ob = [newOb retain]; } }

 

二、atom

@property(nonatomic,copy)NSObject *ob; @property(copy)NSObject *ob;

等效於:

-(void)setOb:(NSObject *)newOb { if (thetest!= newThetest) { [ob release];//非ARC //ob = nil; //ARC thetest= [newOb copy]; } }

 

非gc的對象,因此默認的assign修飾符是不行的。那麼何時用assign、何時用retain和copy呢?推薦作法是NSString用copy,delegate用assign(且必定要用assign,不要問爲何,只管去用就是了,之後你會明白的),非objc數據類型,好比int,float等基本數據類型用assign(默認就是assign),而其它objc類型,好比NSArray,NSDate用retain。 [ http://www.cnblogs.com/andyque/archive/2011/08/03/2125728.html ]

NSString 的爲何要用copy

在@property 聲明NSString變量類型的時候, 通常使用copy,而不是用retain. 
是由於不想改變setter傳來的原變量。

@interface Man 
@property (nonatomic, retain) NSString *name; 
@end

-(void)setName:(NSString *)newName { if ( name != newName ) { [name release]; //非ARC // name = nil; //ARC name = [newName retain]; } }
  •  setter傳來的是一個NSMutableString *mtStr; 
Man *man = [[Man alloc] init];
NSMutableString *newName = [[NSMutableString alloc] initWithString:@"XiaoMing"]; man.name = newName; NSLog( @"the man's name is %@", man.name ); [newName appendString:@"Zhang"]; NSLog( @"the man's name is %@", man.name );

 

這時name就會受到newName變化的影響,因此我以爲前面引用的博客中說 「而其它objc類型,好比NSArray,NSDate用retain」,我以爲是不對的,此類型應該使用copy。 不知是否正確,請你們指教。

相關文章
相關標籤/搜索