首先,我的代码:
@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)它的继承出错了,而且消息是'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
时所做的事情吗?
答案 0 :(得分:4)
子类化NSData比你想象的要复杂得多。在大多数情况下,最好只编写一个围绕NSData而不是完整子类的包装器。
答案 1 :(得分:1)
Slice *ret = [[Slice alloc] initWithBytesNoCopy:b length:len freeWhenDone:NO];
我不确定这是否是根本原因,但这对我来说是一个红旗,可能会引导你朝着一个好方向前进。
编辑:
实际上,我想知道你是否在子类中重写了+ alloc并且没有返回实例......