OC-屬性property

屬性:自動生成setter和getter
聲明:@property 數據類型 實例變量名
屬性實現的寫法,如果類型相同,可以用,隔開,但是類型如果像NSString這種類型的實例變量,需要加*
@synthesize 實例變量名
如果不寫@synthesize, 系統默認生成下面代碼
@synthesize name = _name;
再自動生成實例變量 NSString *_name;
如果系統的setter不能滿足需求,可以重寫setter方法和getter方法
時刻謹記:使用點語法,出現在等號的左邊,表示的是調用設置器,出現在其他地方,表示的是調用訪問器
- (void)setName:(NSString *)name {
    //1
    _name = name;
    //2
    //self.name = name;//error,setter方法中不能夠用self.對實例變量賦值,會造成死循環 //面試題
    NSLog(@"Hello World”);
}
     - (NSString *)name {   
    //1
    return _name;
    //2
    //return self.name;//error錯誤原因同上
    }
如果由系統自動生成@synthesize,重寫setter和getter方法,只能重寫其一,兩個都重寫,系統的@synthesize自動失效
解決方案:如果重寫setter和getter方法,自己來寫@synthesize

屬性的修飾符
修飾符:實質是對setter和getter方法的限定
1.線程安全組
nonatomic:非原子性,不對多線程進行管理,效率高
atomic:原子性,多線程下使用,保證線程安全,但效率低
注:a.默認爲atomic,一般使用nonatomic
b.atomic修飾的屬性,要麼重寫setter和getter,要麼都不重寫,不允許重寫其中的一個方法
2.內存管理組
assign:
retain:
copy:
weak:
strong:
weak和strong是在ARC下才能使用
基本數據類型用assign(默認值)
對象用retain, weak, strong
即是對象,並且對象遵守<NScoping>協議,才能使用copy
注:delegate:寫成屬性,在ARC下用weak,在MRC下用assign
3.讀寫組
readwrite(默認值):可讀寫,生成setter和getter方法
readonly:只讀,只生成getter方法
4.方法重命名
setter = 方法名
getter= 方法名
注:重新修改setter和getter方法的名字,不影響點語法的使用
//ARC
@property (nonatomic, weak)id<LoveDelegate>delegate;
//MRC
@property (nonatomic, assign)id<LoveDelegate>delegate1; }
}

KVC:key-value coding, 鍵值編碼,提供 一種間接訪問屬性的方法
//間接訪問屬性(KVC)
 //設置
 [man setValue:@"lisi" forKey:@"name"];
//獲取
NSLog(@"%@", [man valueForKey:@"name"]);
        
 //通過KVC訪問屬性, key是屬性名,如果key寫錯,會導致程序崩潰
  NSLog(@"%@", [man valueForKey:@"aname"]);
  [man setValue:@"aaa" forKey:@"mena”];
//通過key查找對應的value,如果找不到對應的key,就會走這個方法
//重寫這個方法能夠避免,如果寫錯了key,而導致系統崩潰
- (id)valueForUndefinedKey:(NSString *)key {
    return nil;
   //return @"找不到了吧!寫錯了吧!";
}

- (void)setValue:(id)value forUndefinedKey:(NSString *)key {
    NSLog(@"沒有這樣的key”);
}
//KVC通過字典對多個屬性賦值
        Man *man2 = [[Man alloc] init];
        [man2 setValuesForKeysWithDictionary:@{@"name": @"123", @"age": @18, @"Job":@"study"}];
        NSLog(@"%@", man2);
//son是一個類 father是一個類 father中有個變量是son
//通過keypath訪問屬性
        NSLog(@"%@", [father valueForKeyPath:@"son.play"]);
        [father setValue:@"heihei" forKeyPath:@"son.play"];
        NSLog(@"%@", [father valueForKeyPath:@"son.play"]);
}
//KVC在數組中的使用
        NSLog(@"%@",[array valueForKey:@"@count"]);
        NSLog(@"%@", [array valueForKeyPath:@"@max.age"]);
        NSLog(@"%@", [array valueForKeyPath:@"@min.age"]);
        NSLog(@"%@", [array valueForKeyPath:@"@avg.age"]);
        NSLog(@"%@", [array valueForKeyPath:@"@sum.age"]);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章