簡體   English   中英

KVC-帶點分隔的鍵值編碼-不符合KVC的異常

[英]KVC - key value coding with dot seperation - Exception not KVC compliant

@interface MyClass: NSObject
@property NSArray *arr;
@end
@inplementation MyClass
- (instancetype) init
{
    if(self = [super init])
    {
        self.arr = [[NSArray alloc] init];
    }
    return self;
}
@end
int main(int argc, char *argv[])
{
    MyClass *temp = [[MyClass alloc] init];
    [temp valueForKey:@"arr.count"];    //count is ivar of NSArray
    return 0;
}

然后控制台說

NSExceptions:[MyClass valueForUnfinedKey:]此類不是鍵arr.count的鍵值投訴

每當我使用點分隔符時,都會出現此exceptions

我試圖搜索網絡並閱讀菜單,但我仍然不知道為什么,有人可以幫忙嗎? 謝謝。

方法valueForKey:采用一個鍵(屬性或局部變量)名稱,而不采用諸如arr.count類的鍵路徑。

方法valueForKeyPath:確實采用了密鑰路徑,它實際上是valueForKey:調用的序列。 請參閱關於鍵值編碼中的 使用鍵獲取屬性值

但是 ,由於為NSArray定義valueForKey:的方式,您的示例仍然無法使用:

返回一個數組,該數組包含調用valueForKey:在每個數組對象上使用key的結果。

因此,在您的情況下,如果您嘗試valueForKeyPath:@"arr.count" ,則路徑的arr部分將返回您的數組,然后NSArrayvalueForKey:將嘗試獲取該數組的每個元素count不是數組本身。 不是你想要的...

這使我們遇到了集合運算符 ,后者提供了對集合,數組(而不是其元素)起作用的關鍵路徑。 您需要的集合運算符是@count為您提供關鍵路徑arr.@count ,因此您需要調用:

[temp valueForKeyPath:@"arr.@count"]

除非這是學習KVC的練習,否則可以簡化為:

temp.arr.count

這沒有嘗試將count應用於數組元素的問題,並返回NSUInteger值而不是NSNumber實例。

HTH

這是因為arr.count不是MyClass的鍵值投訴。 程序運行時,找不到MyClass名稱arr.count任何屬性。

valueForKeyPath:-返回相對於接收者的指定密鑰路徑的值。 密鑰路徑序列中不符合特定鍵的鍵值編碼的任何對象(即valueForKey:的默認實現無法找到訪問器方法)都接收到valueForUndefinedKey:消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM