0

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
)
4

1 に答える 1

0

@Rob が指摘したリンクには、一番下に正しい答えがありました。あいまいな事実: 何かが descriptionWithLocale: を実装している場合、NSLog は代わりにそれを呼び出します。私のクラスは NSArray のサブクラスであり、NSArray はそれを実装しているので、記述の私のバージョンは呼び出されませんでした。

于 2013-01-30T03:28:23.737 に答える