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

何らかの理由で、スライスインスタンスが実際には具体的なインスタンスではない(?)か、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メソッドは自分自身を再割り当てすることが許可されているため、常にallocと同じ行で使用する必要があります。

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

それが根本的な原因であるかどうかはわかりませんが、それはあなたを良い方向に導くかもしれない私にとっての危険信号です。

編集:

実際、サブクラスで+ allocをオーバーライドしていて、インスタンスを返さないのではないかと思います...

于 2012-06-15T17:08:46.463 に答える