[英]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.