@property 是OC中可以快速定義一個屬性的關鍵字,以下咱們定義一個屬性。objective-c
@property NSString *String;
這樣咱們就可使用這個屬性安全
// // Created by chao on 15/8/29. // Copyright (c) 2015 ___FULLUSERNAME___. All rights reserved. // #import <Foundation/Foundation.h> @interface Person : NSObject{ NSString *firstName; NSString *lastName; } - (void)setFirstName:(NSString *)first; - (NSString *)firstName; - (void)setLastName:(NSString *)last; - (NSString *)lastName; @end //在.m文件裏實現 #import "Person.h" @implementation Person { } - (void)setFirstName:(NSString *)first { firstName = [first copy]; } - (NSString *)firstName { return firstName; } - (void)setLastName:(NSString *)last { lastName = [last copy]; } - (NSString *)lastName { return lastName; } @end
如今有了@property
只要簡單的聲明一下就可讓編譯器替咱們作以上哪些繁雜的工做。多線程
@property NSStrinng *firstNmae; @property NSString *lastName;
編譯器會自動在屬性名以前添加下劃線,一次做爲實例變量的名字,在上面的聲明中會生成兩個實例變量
_firstNam, _lastName.咱們也可使用@synthesize語法指定實例變量的名字。app
@synthesize firstName = _myFirstName; //使用指定的實例變量名稱 @synthesize lastName = _myLastName;//若是沒有特殊須要儘可能使用系統默認的名稱
@property NSStrinng *firstNmae; @property NSStrinng *firstNmae; @dynamic firstName, lastname; //編譯器不會自動爲這兩個屬性合成存取方法,或實例變量。
在爲以上類添加一個只讀的ID和weight屬性。性能
@property (readonly) NSInteger ID; @property (readwrite) NSInteger height;
若是咱們這程序中試圖修改person 的ID屬性編譯器就會報錯優化
生命週期類型的特性包括, assign, strong, weak和copy 這些特性決定了存方法如何處理與其相關的內存管理問題atom
@property (assign) NSInteger ID; 這段代碼等同於實現了一下存方法 - (void)setID:(NSInteger)d { ID = d; }
看了不少博客講解的copy都只是簡單的說了一下,copy特性要求拷貝傳入對象。並無進行深刻的講解,好比爲何要copy傳入對象,下面我寫一下我本身對copy的理解線程
@property (strong) NSString *firstName; @property (copy) NSString *lastName; NSMutableString *name = [[NSMutable alloc] initWithString:@"Li"]; [person setFirstNmae:name]; [person setLastName:name];//這樣修改name 不會對實例變量產生影響。 //看如下程序的輸出 NSMutableString *firstName = [NSMutableString stringWithString:@"Zhang"]; NSMutableString *lastName = [NSMutableString stringWithString:@"San"]; person.firstName = firstName; person.lastName = lastName; NSLog(@"修改前的 :%@%@", person.firstName, person.lastName); [firstName appendString:@"fe"]; [lastName appendString:@"aefa"]; NSLog(@"修改後的 :%@%@", person.firstName, person.lastName); NSLog(@"%@%@", firstName, lastName);
2.若是傳入的對象是不可修改的,copy方法實際是在調用copyWithZone:通常咱們自定義的對象若是要求copy,應該重寫 copyWithZone:方法從而優化copy過程code
- (id)copyWithZond { return self; }