13

新しい 4.0.2 iOS アップデートについて読んでいたとき、ハッカーが何をするのか、またはバッファ オーバーフローを試みているのか知りたいと思っていました。ウィキペディアをいくつか調べた後、malloc で遊んで、独自の「NSObject」を作成することに興味を持ちました。

私は実際に私のアプリケーションでこれを使用する予定はありません。目的の c を学習したり遊んだりするためだけです。

もちろん、予想通り、自分では解決できない問題に遭遇しました。

私のオブジェクトを作成するために私は:

+ (id)create{ return malloc(sizeof(self)); }

- (void)free { free(self); }

[TestObject create] を呼び出す場合。次のコンソール メッセージが表示されます。

「8/11/10 11:17:31 PM TestingHeap[2675] *** NSInvocation: 警告: クラス 'AObject' のオブジェクト 0x100002100 は doesNotRecognizeSelector を実装していません: -- 中止」

それで、私のオブジェクトを NSObject として処理しようとしています..?どうすればこれを解決できますか。

また、Foundation または AppKit を使用せずにコンパイルすると、特に __objc_empty_vtable と __objc_empty_cache のシンボルが見つからないというエラーが発生します。/usr/include/objc/ からいくつかのヘッダーファイルをインクルードしようとしました

前もって感謝します。

アップデート

libobjc とリンクした後、クラスからメソッドを呼び出そうとすると、EXC_BAD_INSTRUCTION を受け取ります。

4

1 に答える 1

9

Davidが指摘したように、class_getInstanceSizeの代わりに使用する必要があります。sizeof

libobjc にリンクする必要があります (自分で見つけたように)。

基本クラスには、メソッドisaで設定する必要があるポインターが必要です。create

また、ランタイムには、+initializeクラスが初めて使用される前に呼び出されるメソッドを実装する必要があります。欠落している場合、クラッシュします。

したがって、基本クラスには少なくとも次のものが必要です。

#include <objc/objc.h>
#include <objc/runtime.h>
#include <stdlib.h>

@interface MyBase {
    Class isa;
}

+ (id) alloc;
- (void) free;

@end

@implementation MyBase

+ (void) initialize;
{
}

+ (id) alloc;
{
        size_t size = class_getInstanceSize( self );
        MyBase *result = malloc( size  );
        result->isa = self;
        return result;
}

- (void) free;
{
        free( self );
}

@end
于 2010-08-26T11:46:40.427 に答える