iOS開發 KVC 成員變量、實例變量、屬性的區別

成員變量、實例變量、屬性的區別html

@interface Person : NSObject
{
    @public//默認爲私有屬性,爲了讓外部能夠訪問,須要設置爲公有
    int age;//成員變量
    UIButton *btn;//實例變量
    NSString *string;
    // id 是OC特有的類,本質上講id等同於(void *)。因此id data屬於實例變量。
    id className;
}
//屬性變量
@property(strong,nonatomic)NSString *  name;

複製代碼

1.在{}中的都是成員變量 2.實例變量本質上也是成員變量,只是實例是針對類而言,實例是指類的聲明,因此成員變量 = 基礎數據類型變量 + 實例變量。 3.成員變量用於類內部,無需與外界接觸的變量。由於成員變量不會生成settergetter方法,因此外界沒法與成員變量接觸。 4.屬性 會自動生成settergetter方法。 部分註釋參考這位大佬 當LLVM編譯器沒有發現跟實例變量相匹配的屬性時,會自動生成一個帶下劃線的成員變量 KVC的基本使用面試

  • 獲取變量屬性 根據鍵值獲取:valueForKey: 根據路徑獲取:valueForKeyPath: 獲取未定義的值(對象中實現,防止崩潰):valueForUndefinedKey: 獲取數組中字典key對應的value:dictionaryWithValuesForKeys:
NSArray *array =@[@{@"name":@"123",@"age":@"3"},
                      @{@"name":@"1233",@"age":@"3"},
                      @{@"name":@"12563",@"age":@"3"},
                      @{@"name":@"1273",@"age":@"3"},
                      @{@"name":@"1323",@"age":@"3"},
                      @{@"name":@"1213",@"age":@"3"}];
    NSArray *keys = @[@"name"];//容許多個值
    //返回與接收者相關的鍵數組的值,這個方法會在數組中反覆調用valueForKey:
    NSDictionary *dic = [array dictionaryWithValuesForKeys:keys];
    NSLog(@"%@",dic);
//輸出結果
/*
2019-03-11 23:44:04.977743+0800 003---KVC[57960:5195703] {
    name =     (
        123,
        1233,
        12563,
        1273,
        1323,
        1213
    );
}
*/

複製代碼

設置變量屬性 根據鍵值設置:setValue:forKey: 根據路徑設置:setValue:forKeyPath: 設置未定義的值(對象中實現,防止崩潰):setValue:forUndefinedKey: 給對象設置對應字典裏的值(字典轉model):setValuesForKeysWithDictionary:數組

//Person.h
@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *age;
-(instancetype)initWithDic:(NSDictionary *)dic;
@end

//Person.m
@implementation Person
-(instancetype)initWithDic:(NSDictionary *)dic{
    if (self = [super init]) {
        [self setValuesForKeysWithDictionary:dic];
    }
    return self;
}
//若是沒有實現,就會崩潰。
-(void)setValue:(id)value forUndefinedKey:(NSString *)key{
    NSLog(@"沒找到對應的key == %@",key);
}
@end

//ViewController.m

NSDictionary *dic = @{@"name":@"張三",@"age":@"3",@"nickName":@"小張"};

Person *person = [[Person alloc]initWithDic:dic];
NSLog(@"name === %@,age === %@",person.name,person.age);

//Log
2019-03-11 23:58:06.088639+0800 003---KVC[58290:5225184] 
沒找到對應的key == nickName
2019-03-11 23:58:06.088872+0800 003---KVC[58290:5225184] 
name === 張三,age === 3

複製代碼

集合類型操做markdown

NSArray *array =@[@{@"name":@"123",@"age":@"3"},
                      @{@"name":@"1233",@"age":@"3"},
                      @{@"name":@"12563",@"age":@"3"},
                      @{@"name":@"1273",@"age":@"3"},
                      @{@"name":@"1323",@"age":@"3"},
                      @{@"name":@"1213",@"age":@"3"}];

複製代碼

取和:@sumoop

NSNumber *sum = [array valueForKeyPath:@"@sum.name"];
NSLog(@"%@",sum);
/*
2019-03-12 10:03:42.334510+0800 003---KVC[60292:5345096] 17728
*/

複製代碼

取平均值:@avg測試

NSNumber *avg = [array valueForKeyPath:@"@avg.name"];
NSLog(@"%@",avg);
/*
2019-03-12 10:07:33.451318+0800 003---KVC[60430:5353667] 2954.666666666667
*/

複製代碼

取數量:@countatom

NSNumber *count = [array valueForKeyPath:@"@count"];
NSLog(@"%@",count);
/*
2019-03-12 10:09:09.275149+0800 003---KVC[60482:5357387] 6
*/

複製代碼

取最大值:@max、最小值@minspa

NSArray *array =@[@{@"name":@123,@"age":@"3"},
                      @{@"name":@333,@"age":@"3"},
                      @{@"name":@563,@"age":@"3"},
                      @{@"name":@1111,@"age":@"3"},
                      @{@"name":@756,@"age":@"3"},
                      @{@"name":@38459,@"age":@"3"}];
NSNumber *max = [array valueForKeyPath:@"@max.name"];
NSLog(@"%@",max);
/*
2019-03-12 10:11:06.436314+0800 003---KVC[60552:5361854] 38459
*/

複製代碼

還有其餘用法待測試 @distinctUnionOfObjects @unionOfObjects @distinctUnionOfArrays @unionOfArrays @distinctUnionOfSets valueForKey:執行流程代理

1.在實例中 按照順序 搜索是否有get<Key>, <key>, is<Key>或者_<key>code

2.若是第一步沒有找到對應的方法,就看看有沒有countOf<Key>,

objectIn<Key>AtIndex:,<key>AtIndexes: 這幾個方法,若是有找到,就會建立一個集合代理對象(應該是NSArray),並返回這個對象。

3.若是第二步仍是沒有,就找countOf<Key>,enumeratorOf<Key>,memberOf<Key>:這三個,返回一個NSSet對象。

4.仍是沒找到。若是accessInstanceVariablesDirectly的值爲YES(默認就是YES), 按順序 搜索實例變量_<key>, _is<Key>, <key>, is<Key>, 若是找到了,就返回結果,沒找到就執行 valueForUndefinedKey:

setValue:forKey:執行流程

1.按順序 找set<Key>:,_set<Key>:,若是有對應的方法就執行它。

2.若是沒有這些方法,accessInstanceVariablesDirectly的值爲YES(默認就是YES),就 按順序 看看有沒有這些值_<key>, _is<Key>, <key>, or is<Key>,若是有,就直接給這些值的其中一個賦值。

3.若是仍是沒有,就走setValue:forUndefinedKey:

在嚴峻的iOS市場中競爭, 沒有掌握和了解一些具備優點的技術性知識,你怎麼與別人進行PK,又怎麼征服你的面試官。作過三五年的也未必必定會涉足到裏面的技術性知識。在找工做中,技術足了,找不到工做也許你缺乏的是一份總結和一份面試題去練習。

[最新面試大廠常問面試答案一份和iOS技術資源]。但願真心可以幫助到你們提高技術!

關注下面的標籤,發現更多類似文章

相關文章
相關標籤/搜索