8

Foundationなしで簡単なObjectiveCプログラムを作成したいと思います。私は試した:

#include <stdio.h>

@interface Foo{
    char * bar;
}
-(void)hello;
@end

@implementation Foo
-(void)hello {
    printf("Hello world!");
}
@end

int main(){
    Foo * foo = [Foo alloc];
    return 0;
}

それからそれは私に教えFoo may not respond to +allocautorelease called without pool...

allocFoundationから使用せずにオブジェクトを初期化するにはどうすればよいですか?

4

3 に答える 3

9

allocFoundationを使用せずに、新しいオブジェクトを作成するのは非常に簡単です。Objective-Cランタイムライブラリ自体は、クラスからオブジェクトを割り当て、後でそれらの割り当てを解除できる関数を提供するため、オブジェクトを作成および破棄するために追加のライブラリは必要ありません。

この関数id class_createInstance(Class cls, size_t extraBytes)は、新しいオブジェクトを割り当てるクラスオブジェクトと、ほとんどの場合ゼロである整数を受け取り、の新しいインスタンスを返しますcls

同様に、この関数id object_dispose(id obj)はObjective-Cオブジェクトを受け取り、すべてのC++オブジェクトインスタンス変数のC++デストラクタを呼び出し、既存の関連する参照を削除して解放します。

class_createInstanceobject_disposeは両方ともで宣言されてい/usr/include/objc/runtime.hます。

+allocしたがって、独自のメソッドを実装できます-dealloc。プログラムは次のようになります。

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

@interface Foo{
    char * bar;
}
+(id)alloc;
-(void)hello;
@end

@implementation Foo
+(id)alloc {
    // Returns a new 'Foo' object. In this case, 'self' is a 'Foo' class object,
    // whose type is 'Class', as required by `class_createInstance`.
    return class_createInstance(self, 0);
}
-(void)dealloc {
    object_dispose(self);
}
-(void)hello {
    printf("Hello world!");
}
@end

int main(){
    Foo *foo = [Foo alloc];
    [foo hello];
    [foo dealloc];

    return 0;
}

通常どおりにコンパイルします。

gcc Foo.m -o Foo -lobjc

それで全部です!

于 2013-03-24T00:06:17.670 に答える
1

Foundation なしで Objective C を作成することはできますが、もちろん、ある程度車輪を再発明することになるかもしれません。

millimoose が示唆するように、 GNUStep Objective C runtimeを使用できます。

詳細については、次を参照してください。

于 2013-03-23T22:59:04.847 に答える
0

基盤の一部である NSObject から継承しないため、alloc を定義しません。

ここでは、次の 2 つのケースがあります。

  1. ファンデーションが悪だと思っているか、なぜか使えない。
  2. あなたは運動のためにそれをやっています。

2 番目のケースではなく、ファンデーションを使用できない特定のケースでもない場合は、選択を再検討します。

ただし、foundation を使用したくない場合は、alloc は isa ポインターが初期化されたオブジェクトを返す必要があります。

于 2013-03-23T23:07:07.237 に答える