簡體   English   中英

鍵值編碼和多對多關系

[英]key-value coding and to-many relationships

我對鍵值編碼和多對多關系有點困惑。 我已經讀過,當我有這樣的關系時,我應該使用[object mutableArrayValueForKey:@“key”]; 檢索保存有序關系中的對象的可變數組。

我不明白的是mutableArrayValueForKey或valueForKey之間的區別是什么。

讓我舉個例子來說明(數組是自我設置的NSMutableArray作為屬性):

id array1= [self valueForKey:@"array"];

NSLog(@"first element %@",[array1 objectAtIndex:1]);

id array2 = [self mutableArrayValueForKey:@"array"];

NSLog(@"first element %@",[array2 objectAtIndex:1]);

兩個調用返回完全相同。 在這種情況下,第二個的好處或不同之處是什么?

干杯!

mutableArrayValueForKey不返回“array”,它返回“array”的代理。 如果打印出類,可以看到這個:

NSLog(@"%@", [self.array class]);
NSLog(@"%@", [[self valueForKey:@"array"] class]);
NSLog(@"%@", [[self mutableArrayValueForKey:@"array"] class]);

這打印:

2010-02-24 20:06:44.258 Untitled[25523:a0f] NSCFArray
2010-02-24 20:06:44.275 Untitled[25523:a0f] NSCFArray
2010-02-24 20:06:44.276 Untitled[25523:a0f] NSKeyValueSlowMutableArray

閱讀mutableArrayValueForKey文檔 ,了解有關該代理如何工作的詳細信息。 在這種特殊情況下,您碰巧有一個真正的NSMutableArray作為ivar。 但如果沒有這樣的伊娃怎么辦? 您可以使用countOf<Key>objectIn<Key>AtIndex:等方法在沒有ivar支持屬性的情況下實現KVC。 只要您能夠將合理的結果返回到KVC方法,就沒有規則存在實際的“陣列”ivar。

但是如果你想暴露一個NSMutableArray接口,但你沒有真正的NSMutableArray怎么辦? 這就是mutableArrayValueForKey的用途。 它返回一個代理,當訪問它時會將KVC方法轉換回給你,包括insertObject:in<Key>AtIndex:向你發送變異到多種方法,如insertObject:in<Key>AtIndex: .

這甚至發生在你有一個真正的ivar(如你的情況),你只是沒有注意到它,因為代理行為非常像真實的對象。

第一個元素實際上是objectAtIndex:0 ,而不是objectAtIndex:1

此外,第二種方法確保您可以使用addObject:removeObjectAtIndex:修改返回的數組,即使key @"array"值是不可removeObjectAtIndex: @"array"也是如此。

暫無
暫無

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

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