@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
一、 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中 }
一、性能
@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 ]
在@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]; } }
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。 不知是否正確,請你們指教。