3

首先,我的代码:

@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;
}

其中Slice是 的一个简单子类NSData

出于某种原因,我收到了一个运行时错误,这似乎表明我的 Slice 实例要么 a) 实际上不是一个具体实例 (?) 要么 b) 其继承出现问题并且消息本身没有绑定正确切片(几乎可以肯定是由于我还未知的错误)。

我得到的确切错误是:

*** 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事情吗?

4

2 回答 2

4

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

于 2012-06-15T17:03:50.270 回答
1

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

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

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

编辑:

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

于 2012-06-15T17:08:46.463 回答