首先,我的代碼:對象 - 子似乎並沒有認識到繼承的選擇
@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)其繼承中出現問題,並且消息isn沒有把自己綁定到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'差可可風格(尤其是不需要重新分配),不應該在任何不屬於你的類上完成(因爲你不能確定'init'不會拋棄它傳遞的對象並返回一個新對象) 。 –
見下文;那時我不關心風格。這是我多年來採用的調試技術。我知道這樣做的危險,但是在那個時候,我可以想到的其他事情並不多。 –