覆盖类集群方法时出现意外结果

时间:2013-01-30 03:07:15

标签: ios objective-c macos design-patterns

在实现NSArray(类集群)的子类时,我惊讶地发现我的被覆盖的描述方法没有被调用。有人可以解释一下这里发生了什么吗?

@interface MyArrayClassCluster : NSArray

@end

@implementation MyArrayClassCluster
{
    NSArray *_realArray;
}

// Implement the class cluser stuff here
- (NSUInteger)count
{
    return [_realArray count];
}

- (id)objectAtIndex:(NSUInteger)index
{
    return [_realArray objectAtIndex:index];
}

// lifeCycle

- (id)initWithItems:(NSArray *)items
{
    self = [super init];
    _realArray = [items retain];
    return self;
}

- (void)dealloc
{
    [_realArray release];
    [super dealloc];
}

- (NSString *)description
{
    return [NSString stringWithFormat:@"My Custom Array: %p, objs:%@", self, _realArray];
}

@end

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        NSArray *a = @[@1, @2, @3];
        NSLog(@"a: %@", a);
        MyArrayClassCluster *clzCluster = [[MyArrayClassCluster alloc] initWithItems:a];
        NSLog(@"clzCluster: %@", clzCluster);
    }
    return 0;
}

输出

2013-01-29 18:52:38.704 ClassClusterTester[31649:303] a: (
    1,
    2,
    3
)
2013-01-29 18:52:38.707 ClassClusterTester[31649:303] clzCluster: (
    1,
    2,
    3
)

1 个答案:

答案 0 :(得分:0)

@Rob指向的链接在底部有正确的答案。一个不起眼的事实:如果某些东西实现了descriptionWithLocale :, NSLog会调用它。由于我的类是NSArray的子​​类,并且NSArray实现了它,因此我的描述版本没有被调用。