【发布时间】:2012-06-15 17:00:06
【问题描述】:
首先,我的代码:
@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) 其继承出现问题并且消息不是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的时候不就是这样吗?
【问题讨论】:
-
拆分
alloc/init是糟糕的 Cocoa 风格,(尤其是在没有重新分配的情况下)并且永远不应该在任何不属于你的课程上完成(因为你不能确保init不会丢弃它传递的对象并返回一个新对象)。 -
见下文;那时我并不关心风格。这是我多年来采用的一种调试技术。我知道这样做的危险,但那时我想不到其他的办法。
标签: objective-c inheritance subclass