ios,KVC,当我调用[[MyObject valueForKey:“MyArray”] count]时,为什么不调用countOf <key> </key>

时间:2013-04-12 10:15:51

标签: objective-c nsarray key-value-coding kvc

..................

    Environment:OSX10.8, Xcode4.5
    Reference:
    https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual
    /KeyValueCoding/Articles/SearchImplementation.html#//apple_ref/doc/uid
    /20000955-CJBBBFFA

    If the countOf method and at least one of the other two possible methods are 
    found, a collection proxy object that responds to all NSArray methods is 
    returned. Each NSArray message sent to the collection proxy object will result 
    in some combination of countOf, objectInAtIndex:, and AtIndexes: messages being 
    sent to the original receiver of valueForKey:.

我的步骤:

1)在MyObject.h中为property创建NSArray* arrs

2)在MyObject.m中

@implementation MyObject
- (void)setArrs:(NSArray*)arrs
{ _arrs=arrs; }

- (NSUInteger) countOfArrs
{ NSLog("Im here");
  return 0;}

- (id) objectInArrsAtIndex:(NSUInteger)index
{ NSLog(@"objectInArrs");
  return nil;
}

@end

3)测试代码

MyObject* obj=[[MyObject alloc] init];
NSArray* arr=[NSarray arrayWithObjects:@"abc",nil];
[obj setArrs:arr];
NSLog(@"%d",[[obj valueForKey:@"arrs"]count]);
NSLog(@"%@",[[obj valueForKey:@"arrs"] objectobjectAtIndex:0])

我的问题:

我希望它能自动调用countOfArrsobjectInArrsAtIndex:, 但事实并非如此。它只是返回正常的NSArray,显示计数数量为1 和'abc'。

我没有找到任何有用的样本,或者我误解了医生说的话,不是吗?

我的语言不是英语,希望我没有提出任何雄心勃勃的问题。

1 个答案:

答案 0 :(得分:3)

您实施的功能超出了所需的功能。您的@property声明正在添加-<key> getter和-set<Key>访问者。正如您所知,您的getter(由valueForKey:@"arrs"调用)返回分配给该属性的实际NSArray,该属性返回其计数和对象。

您链接到的指南有理由说明这在默认搜索模式的步骤1 第2步中无法使用,因为valueForKey: section。

基本上,只有在没有-countOf<Key>-objectIn<Key>AtIndex:-<key>方法时才会调用-get<Key>-is<Key>方法。

为了使其工作,你需要通过删除@property声明来删除getter,然后你需要添加一个实例变量来保存你的数组。

将此设为您的界面,它应该可以正常工作

@interface MyObject : NSObject {
  NSArray *_arrs;
}
@end