Obj-C子类似乎没有识别继承的选择器

时间:2012-06-15 17:00:06

标签: objective-c inheritance subclass

首先,我的代码:

@interface Block : NSObject {
    NSData *data;
    NSInteger slice_count;
}

@property (readonly) NSData *data;

+ (Stopwatch *) runOldTestsUsingConfiguration:(TestConfiguration *)c;

- (Slice *) getSlice:(NSUInteger)idx;

@end

- (Slice *) getSlice:(NSUInteger)idx {
    void *b = (void*)[data bytes] + idx*slice_count;
    int len = [data length] / slice_count;
    Slice *ret = [Slice alloc];
    [ret initWithBytesNoCopy:b length:len freeWhenDone:NO];
    return ret;
    //NSString *temp2 = [data description];
    //NSRange r = NSMakeRange(idx*slice_count, [data length] / slice_count);
    //NSData *d = [data subdataWithRange:r];
    //NSString *temp = [d description];
    //Slice *s = [[Slice alloc] initWithBytesNoCopy:(void *)[d bytes] length:r.length freeWhenDone:NO];
    //return s;
}

其中SliceNSData的简单子类。

由于某种原因,我得到一个运行时错误,似乎表明我的Slice实例a)实际上不是一个具体的实例(?)或b)它的继承出错了,而且消息是'n' t正确地将自己绑定到Slice(几乎可以肯定是由于我未知的错误)。

我得到的确切错误是:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '***
initialization method -initWithBytes:length:copy:freeWhenDone:bytesAreVM:
cannot be sent to an abstract object of class Slice: Create a concrete instance!'

任何人都可以帮助我吗?我已经尝试了所有我能想到的东西(其中的基本例程在消息调用本身中有详细说明)并且我仍然在干涸。当它说'创建具体实例'时意味着什么?这不是我在alloc时所做的事情吗?

2 个答案:

答案 0 :(得分:4)

子类化NSData比你想象的要复杂得多。在大多数情况下,最好只编写一个围绕NSData而不是完整子类的包装器。

答案 1 :(得分:1)

IIRC,允许init方法重新分配self,因此应始终与alloc在同一行使用。

Slice *ret = [[Slice alloc] initWithBytesNoCopy:b length:len freeWhenDone:NO];

我不确定这是否是根本原因,但这对我来说是一个红旗,可能会引导你朝着一个好方向前进。

编辑:

实际上,我想知道你是否在子类中重写了+ alloc并且没有返回实例......