Property属性,amp;nbsp;KVC键值编码OC…
生活随笔
收集整理的這篇文章主要介紹了
Property属性,amp;nbsp;KVC键值编码OC…
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1、屬性:幫你自動生成setter 和 getter 方法 ???? 屬性的聲明:(寫在.h中) ???? 格式: @property 數(shù)據(jù)類型 屬性名 ???? 屬性的實現(xiàn):(寫在.m中) ???? 格式: @synthesize 屬性名: 例子1: Person.h @interface Person : NSObject //屬性的聲明:屬性:屬性名就是實例變量名去掉下劃線
@property NSString *gender; @end
Person.m //屬性的實現(xiàn) @synthesize gender; @end
main.m //屬性方法實現(xiàn)gender的setter和getter方法
??? person.gender = @"妖";
??? NSLog(@"%@",person.gender);//點語法 ???NSLog(@"%@",[person gender]);//setter、getter方法 例子2: teach.h @interface Teacher : NSObject //輸入屬性的類型相同的話,此時就可以把它們寫在一個屬性聲明中,但是每一個屬性名前要加*,(是基本數(shù)據(jù)類型的就不用加*) @property NSString *name,*color;
@property NSInteger age; @property CGFloat score; @end
teach.m //屬性的實現(xiàn)部分可以寫在一起,用逗號隔開 //@synthesize name,color,age,score; //自Xcode5.0之后屬性實現(xiàn)部分不應(yīng)寫了,極大提高了變成速率 //如果不寫了,系統(tǒng)默認幫你生成以下語句,自動創(chuàng)建一個_name實例變量,并且自動生成setter 和getter方法 //如果實例變量不寫
//@synthesize name = _name;
- (NSString *)description {??? +++++++++description 中不能打印self+++++++++++ ???// return [NSString stringWithFormat:@"%@-%ld-%.2lf-%@-%@", _name,_age,_score,_color,self]; ? ? ? ?(1)ERROR!!! ??? return [NSString stringWithFormat:@"%@-%ld-%.2lf-%@", _name,_age,_score,self.color];//這樣是可以的 }? 屬性的優(yōu)化: ?1.屬性的聲明和實現(xiàn)可以合并
?2.實現(xiàn)可以省略實例變量的聲明(系統(tǒng)自動幫你生成屬性名 加下劃線的實例變量 如:_name) ?3.屬性的實現(xiàn)可以省略
main.m ? //定義一個Teacher類,實例變量name age score color ??? //定義一個Teacher對象
??? Teacher *tea = [[Teacher alloc]init];
??? tea.name = @"小倉";
??? tea.age = 18;
??? tea.score = 85.3; ??? tea.color = @"純白種人"; ??? NSLog(@"%@-%ld-%.2lf-%@",tea.name,tea.age,tea.score,tea.color); ???NSLog(@"%@",tea); ====================================================== 2、屬性的屬性:屬性的修飾符 ? 主要用來控制setter 和 getter 的方法的實現(xiàn)細節(jié) ????1.訪問控制組 atomic:原子性,修飾的屬性同一時刻只能使用setter 或getter,(setter和getter 是互斥的),安全但效率低; ???????? atomic 使用場景:在多線程下為保護數(shù)據(jù)安全可以使用atomic ? ? ? ? ? ? ?? ? nonatomic :非原子性,允許同時使用setter 或getter方法,不安全但效率高,推薦使用nonatomic ???? 2.內(nèi)存管理組
????assign 默認值? 基本數(shù)據(jù)類型使用assign修飾,代理屬性使用assign修飾
???? retain 對象類型一般使用retain ????copy? 字符串一般用copy修飾,如果要使用copy修飾屬性,這個屬性必須遵循NSCoping協(xié)議 ???? 3.讀寫控制組
???? readWrite : 可讀可寫,自動幫你生成setter 和getter 方法 ?默認值 ???? readOnly? :只讀,系統(tǒng)只幫你生成getter方法 ???? 4.重命名組 ???? setter = setter新名字 ???? getter = getter 新名字 (除了BOOL特殊情況,其他的一般不使用這種方法) 例子1:定義一個Boy的類;實例變量 name age gender ? ? 自定義初始化方法 ? ? 遍歷構(gòu)造器方法 ? ? 重寫description 方法
Boy.h @interface Boy : NSObject //屬性修飾符寫在@propety后面的()小括號中
//屬性修飾符可以寫多個,每一個修飾符之間用逗號隔開
//系統(tǒng)默認readwrite? ,平時可以不寫
@property (nonatomic,copy,readwrite,setter=setAAA:,getter=AAA)NSString *name;
@property (atomic,copy,readwrite)NSString *gender; @property (nonatomic,assign,readonly)NSInteger? age; //蘋果的習(xí)慣,如果一個屬性是Bool類型的,會對getter方法重命名 @property (nonatomic,assign,readwrite,getter=isFalg)BOOL flag; @end
Boy.m ?使用屬性可以不寫實現(xiàn)部分
main.m //建一個Boy對象
??? Boy *boy = [Boy boyWithName:@"zhangsan" gender:@"yao" age:18]; ???NSLog(@"%@",boy); // readOnly? 只讀不能寫
//??? boy.age = 18; ?error!! ???NSLog(@"%ld",boy.age); ??? //name屬性的setter和getter方法起了別名
??? [boy setAAA:@"Lisi"];
??? NSLog(@"%@",[boy AAA]);
??? boy.name = @"Wanger";
??? NSLog(@"%@",boy.AAA);
??? boy.name = @"Mazi"; ???NSLog(@"%@",boy.name); 例子2: 定義一個Girl類,實例變量 name,sex,age,height,寫屬性的屬性,自定義初始化方法,便利構(gòu)造器方法,重寫description方法
Girl.h @interface Girl : NSObject
@property (nonatomic,copy)NSString *name;
@property(nonatomic,copy) NSString *sex;
@property (nonatomic,assign)NSInteger age;
@property (nonatomic,assign)CGFloat height;
//- (void)sayHi; error!!!
- (id)initWithGirlFriend : (NSString *)name sex : (NSString *)sex age : (NSInteger)age height : (CGFloat)height;
+ (id)girlWithGirlFriend : (NSString *)name sex : (NSString *)sex age : (NSInteger)age height : (CGFloat)height; @end
Girl.m @implementation Girl
//當(dāng)屬性生成的setter和getter方法的實現(xiàn),不滿足你的需求時,可以重寫setter和getter方法 //當(dāng)完全重寫setter和getter方法時,@synthesize name= _name;,就是實效的 ? ? ? ?解決問題的方法 ? ? ?1.只重寫setter和getter 方法中的一個 ? ?? 2.自己添加@synthesize name= _name; @synthesize name= _name;
- (void)setName:(NSString *)name
{
??? NSLog(@"你好小姐");
//??? _name = name;
//???self.name = name;? //self.name == [self setNane : name];
???
//??????????? NSLog(@"%@",self.name); ????? //self.name == [self name];
??????????? _name = name; } - (NSString *)name{
//??? return self.name;? error!!! ? [self name]; ? ? ?(2)ERROR!!! ?
??? return _name;
}
++++++方法內(nèi)部是不能用方法調(diào)用自己++++++
//- (void)sayHi{
//??? NSLog(@"小倉");
//??? [self sayHi]; //} ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ( 3) ERROR!!! //初始化和遍歷構(gòu)造器方法 - (id)initWithGirlFriend : (NSString *)name sex : (NSString *)sex age : (NSInteger)age height : (CGFloat)height{
??? if (self = [super init]) {
??????? _name = name;
??????? _sex = sex;
??????? _age= age;
??????? _height = height;
??? }
??? return self;
}
+ (id)girlWithGirlFriend : (NSString *)name sex : (NSString *)sex age : (NSInteger)age height : (CGFloat)height{
??? return [[Girl alloc]initWithGirlFriend:name sex:sex age:age height:height]; } //description方法 - (NSString *)description
{
??? return [NSString stringWithFormat:@"%@-%@-%ld-%.2lf", _name,_sex,_age,_height]; } -------------------------------------------------------------------- //第3知識點KVC? Key-Value-Coding 鍵值編碼 ?例題中的調(diào)用部分 - (void)setValue:(id)value forUndefinedKey:(NSString *)key{
??? NSLog(@"沒有在Girl類中找到此key值");
}
- (id)valueForUndefinedKey:(NSString *)key{
??? return nil; } @end
main.m Girl *g = [Girl girlWithGirlFriend:@"如花" sex:@"yao" age:28 height:175.6]; ???NSLog(@"%@",g); ??? g.name = @"翠花"; ???NSLog(@"%@",g.name); ==================================================== 3、 KVC? Key-Value-Coding 鍵值編碼 通過KVC訪問實例變量,是一種間接訪問實例變量的形式 例子: Man.h @class Girl;
@interface Man : NSObject
{
??? NSString *_name;
}
@property(nonatomic,retain)Girl *girlFriend;
//@property (nonatomic,copy)NSString *name; //做例子實例變量
@property (nonatomic,assign)NSInteger age;
- (id)initWithName : (Girl *)girlFriend name : (NSString *)name? age : (NSInteger)age;
+ (id)manWithName : (Girl *)girlFriend? name : (NSString *)name? age : (NSInteger)age; @end
Man.m #import "Man.h"
#import "Girl.h" @implementation Man //實現(xiàn)初始化方法 - (id)initWithName : (Girl *)girlFriend? name : (NSString *)name? age : (NSInteger)age{
??? if (self = [super init]) {
??????? _girlFriend = girlFriend;
??????? _age = age;
??????? _name = name;
??? }
??? return self; } //實現(xiàn)遍歷構(gòu)造器方法 + (id)manWithName : (Girl *)girlFriend name : (NSString *)name? age : (NSInteger)age{
??? return [[Man alloc]initWithName:girlFriend name:name age:age];
}
- (NSString *)description
{
??? return [NSString stringWithFormat:@"%@-%@-%ld", _girlFriend,_name,_age]; } ------------------------------------------------ //防止沒有找到對應(yīng)的key值而引起的Crash - (void)setValue:(id)value forUndefinedKey:(NSString *)key ?//容易打錯 {
??? NSLog(@"哈哈,沒有找到對應(yīng)key值");
} //防止沒有找到對應(yīng)的key值而引起的Crash - (id)valueForUndefinedKey:(NSString *)key{
??? return nil;
} @end
main.m //通過key值去類中查找實例變量,先判斷有沒有實例變量name,若沒有就賦值,如果沒有接著判斷有沒有_name,如果有酒賦值 ? ??Man *man = [[Man alloc]init]; ? ? [man setValue:@"妖" forKey:@"name"]; ??? NSLog(@"%@",[man valueForKey:@"name"]);
??? [man setValue:g forKey:@"girlFriend"]; ???NSLog(@"%@",[man valueForKey:@"girlFriend"]);
? //想通過man這個對象給girl 這對象的名字賦值@"棉花" ? [[man valueForKey:@"girlFriend"] setValue:@"棉花" forKey:@"name"];
??? //通過KVC把棉花打印出來
??? NSLog(@"%@",[[man valueForKey:@"girlFriend"]valueForKey:@"name"]);
???
??? //KVC通過路徑賦值取值(即使沒有是實現(xiàn)setter 和 getter 方法也可以通過KVC賦值和取值)
??? [man setValue:@"棉花糖" forKeyPath:@"girlFriend.name"];
???? NSLog(@"%@",[[man valueForKey:@"girlFriend"]valueForKey:@"name"]); ???NSLog(@"%@",[man valueForKeyPath:@"girlFriend.name"]); 總結(jié):注意前三個例題中的ERROR!!!錯誤造成Crash!原因是造成遞歸顯現(xiàn)!
? ? ? ? ? ? ? ? ?歡迎分享本文,未經(jīng)許可,不得轉(zhuǎn)載,轉(zhuǎn)載請注明出處!
@property NSString *gender; @end
Person.m //屬性的實現(xiàn) @synthesize gender; @end
main.m //屬性方法實現(xiàn)gender的setter和getter方法
??? person.gender = @"妖";
??? NSLog(@"%@",person.gender);//點語法 ???NSLog(@"%@",[person gender]);//setter、getter方法 例子2: teach.h @interface Teacher : NSObject //輸入屬性的類型相同的話,此時就可以把它們寫在一個屬性聲明中,但是每一個屬性名前要加*,(是基本數(shù)據(jù)類型的就不用加*) @property NSString *name,*color;
@property NSInteger age; @property CGFloat score; @end
teach.m //屬性的實現(xiàn)部分可以寫在一起,用逗號隔開 //@synthesize name,color,age,score; //自Xcode5.0之后屬性實現(xiàn)部分不應(yīng)寫了,極大提高了變成速率 //如果不寫了,系統(tǒng)默認幫你生成以下語句,自動創(chuàng)建一個_name實例變量,并且自動生成setter 和getter方法 //如果實例變量不寫
//@synthesize name = _name;
- (NSString *)description {??? +++++++++description 中不能打印self+++++++++++ ???// return [NSString stringWithFormat:@"%@-%ld-%.2lf-%@-%@", _name,_age,_score,_color,self]; ? ? ? ?(1)ERROR!!! ??? return [NSString stringWithFormat:@"%@-%ld-%.2lf-%@", _name,_age,_score,self.color];//這樣是可以的 }? 屬性的優(yōu)化: ?1.屬性的聲明和實現(xiàn)可以合并
?2.實現(xiàn)可以省略實例變量的聲明(系統(tǒng)自動幫你生成屬性名 加下劃線的實例變量 如:_name) ?3.屬性的實現(xiàn)可以省略
main.m ? //定義一個Teacher類,實例變量name age score color ??? //定義一個Teacher對象
??? Teacher *tea = [[Teacher alloc]init];
??? tea.name = @"小倉";
??? tea.age = 18;
??? tea.score = 85.3; ??? tea.color = @"純白種人"; ??? NSLog(@"%@-%ld-%.2lf-%@",tea.name,tea.age,tea.score,tea.color); ???NSLog(@"%@",tea); ====================================================== 2、屬性的屬性:屬性的修飾符 ? 主要用來控制setter 和 getter 的方法的實現(xiàn)細節(jié) ????1.訪問控制組 atomic:原子性,修飾的屬性同一時刻只能使用setter 或getter,(setter和getter 是互斥的),安全但效率低; ???????? atomic 使用場景:在多線程下為保護數(shù)據(jù)安全可以使用atomic ? ? ? ? ? ? ?? ? nonatomic :非原子性,允許同時使用setter 或getter方法,不安全但效率高,推薦使用nonatomic ???? 2.內(nèi)存管理組
????assign 默認值? 基本數(shù)據(jù)類型使用assign修飾,代理屬性使用assign修飾
???? retain 對象類型一般使用retain ????copy? 字符串一般用copy修飾,如果要使用copy修飾屬性,這個屬性必須遵循NSCoping協(xié)議 ???? 3.讀寫控制組
???? readWrite : 可讀可寫,自動幫你生成setter 和getter 方法 ?默認值 ???? readOnly? :只讀,系統(tǒng)只幫你生成getter方法 ???? 4.重命名組 ???? setter = setter新名字 ???? getter = getter 新名字 (除了BOOL特殊情況,其他的一般不使用這種方法) 例子1:定義一個Boy的類;實例變量 name age gender ? ? 自定義初始化方法 ? ? 遍歷構(gòu)造器方法 ? ? 重寫description 方法
Boy.h @interface Boy : NSObject //屬性修飾符寫在@propety后面的()小括號中
//屬性修飾符可以寫多個,每一個修飾符之間用逗號隔開
//系統(tǒng)默認readwrite? ,平時可以不寫
@property (nonatomic,copy,readwrite,setter=setAAA:,getter=AAA)NSString *name;
@property (atomic,copy,readwrite)NSString *gender; @property (nonatomic,assign,readonly)NSInteger? age; //蘋果的習(xí)慣,如果一個屬性是Bool類型的,會對getter方法重命名 @property (nonatomic,assign,readwrite,getter=isFalg)BOOL flag; @end
Boy.m ?使用屬性可以不寫實現(xiàn)部分
main.m //建一個Boy對象
??? Boy *boy = [Boy boyWithName:@"zhangsan" gender:@"yao" age:18]; ???NSLog(@"%@",boy); // readOnly? 只讀不能寫
//??? boy.age = 18; ?error!! ???NSLog(@"%ld",boy.age); ??? //name屬性的setter和getter方法起了別名
??? [boy setAAA:@"Lisi"];
??? NSLog(@"%@",[boy AAA]);
??? boy.name = @"Wanger";
??? NSLog(@"%@",boy.AAA);
??? boy.name = @"Mazi"; ???NSLog(@"%@",boy.name); 例子2: 定義一個Girl類,實例變量 name,sex,age,height,寫屬性的屬性,自定義初始化方法,便利構(gòu)造器方法,重寫description方法
Girl.h @interface Girl : NSObject
@property (nonatomic,copy)NSString *name;
@property(nonatomic,copy) NSString *sex;
@property (nonatomic,assign)NSInteger age;
@property (nonatomic,assign)CGFloat height;
//- (void)sayHi; error!!!
- (id)initWithGirlFriend : (NSString *)name sex : (NSString *)sex age : (NSInteger)age height : (CGFloat)height;
+ (id)girlWithGirlFriend : (NSString *)name sex : (NSString *)sex age : (NSInteger)age height : (CGFloat)height; @end
Girl.m @implementation Girl
//當(dāng)屬性生成的setter和getter方法的實現(xiàn),不滿足你的需求時,可以重寫setter和getter方法 //當(dāng)完全重寫setter和getter方法時,@synthesize name= _name;,就是實效的 ? ? ? ?解決問題的方法 ? ? ?1.只重寫setter和getter 方法中的一個 ? ?? 2.自己添加@synthesize name= _name; @synthesize name= _name;
- (void)setName:(NSString *)name
{
??? NSLog(@"你好小姐");
//??? _name = name;
//???self.name = name;? //self.name == [self setNane : name];
???
//??????????? NSLog(@"%@",self.name); ????? //self.name == [self name];
??????????? _name = name; } - (NSString *)name{
//??? return self.name;? error!!! ? [self name]; ? ? ?(2)ERROR!!! ?
??? return _name;
}
++++++方法內(nèi)部是不能用方法調(diào)用自己++++++
//- (void)sayHi{
//??? NSLog(@"小倉");
//??? [self sayHi]; //} ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ( 3) ERROR!!! //初始化和遍歷構(gòu)造器方法 - (id)initWithGirlFriend : (NSString *)name sex : (NSString *)sex age : (NSInteger)age height : (CGFloat)height{
??? if (self = [super init]) {
??????? _name = name;
??????? _sex = sex;
??????? _age= age;
??????? _height = height;
??? }
??? return self;
}
+ (id)girlWithGirlFriend : (NSString *)name sex : (NSString *)sex age : (NSInteger)age height : (CGFloat)height{
??? return [[Girl alloc]initWithGirlFriend:name sex:sex age:age height:height]; } //description方法 - (NSString *)description
{
??? return [NSString stringWithFormat:@"%@-%@-%ld-%.2lf", _name,_sex,_age,_height]; } -------------------------------------------------------------------- //第3知識點KVC? Key-Value-Coding 鍵值編碼 ?例題中的調(diào)用部分 - (void)setValue:(id)value forUndefinedKey:(NSString *)key{
??? NSLog(@"沒有在Girl類中找到此key值");
}
- (id)valueForUndefinedKey:(NSString *)key{
??? return nil; } @end
main.m Girl *g = [Girl girlWithGirlFriend:@"如花" sex:@"yao" age:28 height:175.6]; ???NSLog(@"%@",g); ??? g.name = @"翠花"; ???NSLog(@"%@",g.name); ==================================================== 3、 KVC? Key-Value-Coding 鍵值編碼 通過KVC訪問實例變量,是一種間接訪問實例變量的形式 例子: Man.h @class Girl;
@interface Man : NSObject
{
??? NSString *_name;
}
@property(nonatomic,retain)Girl *girlFriend;
//@property (nonatomic,copy)NSString *name; //做例子實例變量
@property (nonatomic,assign)NSInteger age;
- (id)initWithName : (Girl *)girlFriend name : (NSString *)name? age : (NSInteger)age;
+ (id)manWithName : (Girl *)girlFriend? name : (NSString *)name? age : (NSInteger)age; @end
Man.m #import "Man.h"
#import "Girl.h" @implementation Man //實現(xiàn)初始化方法 - (id)initWithName : (Girl *)girlFriend? name : (NSString *)name? age : (NSInteger)age{
??? if (self = [super init]) {
??????? _girlFriend = girlFriend;
??????? _age = age;
??????? _name = name;
??? }
??? return self; } //實現(xiàn)遍歷構(gòu)造器方法 + (id)manWithName : (Girl *)girlFriend name : (NSString *)name? age : (NSInteger)age{
??? return [[Man alloc]initWithName:girlFriend name:name age:age];
}
- (NSString *)description
{
??? return [NSString stringWithFormat:@"%@-%@-%ld", _girlFriend,_name,_age]; } ------------------------------------------------ //防止沒有找到對應(yīng)的key值而引起的Crash - (void)setValue:(id)value forUndefinedKey:(NSString *)key ?//容易打錯 {
??? NSLog(@"哈哈,沒有找到對應(yīng)key值");
} //防止沒有找到對應(yīng)的key值而引起的Crash - (id)valueForUndefinedKey:(NSString *)key{
??? return nil;
} @end
main.m //通過key值去類中查找實例變量,先判斷有沒有實例變量name,若沒有就賦值,如果沒有接著判斷有沒有_name,如果有酒賦值 ? ??Man *man = [[Man alloc]init]; ? ? [man setValue:@"妖" forKey:@"name"]; ??? NSLog(@"%@",[man valueForKey:@"name"]);
??? [man setValue:g forKey:@"girlFriend"]; ???NSLog(@"%@",[man valueForKey:@"girlFriend"]);
? //想通過man這個對象給girl 這對象的名字賦值@"棉花" ? [[man valueForKey:@"girlFriend"] setValue:@"棉花" forKey:@"name"];
??? //通過KVC把棉花打印出來
??? NSLog(@"%@",[[man valueForKey:@"girlFriend"]valueForKey:@"name"]);
???
??? //KVC通過路徑賦值取值(即使沒有是實現(xiàn)setter 和 getter 方法也可以通過KVC賦值和取值)
??? [man setValue:@"棉花糖" forKeyPath:@"girlFriend.name"];
???? NSLog(@"%@",[[man valueForKey:@"girlFriend"]valueForKey:@"name"]); ???NSLog(@"%@",[man valueForKeyPath:@"girlFriend.name"]); 總結(jié):注意前三個例題中的ERROR!!!錯誤造成Crash!原因是造成遞歸顯現(xiàn)!
? ? ? ? ? ? ? ? ?歡迎分享本文,未經(jīng)許可,不得轉(zhuǎn)載,轉(zhuǎn)載請注明出處!
總結(jié)
以上是生活随笔為你收集整理的Property属性,amp;nbsp;KVC键值编码OC…的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 快速搭建LNMP(1 )
- 下一篇: ABBYY FineReader 12中