2009-07-04 13 views
1

私はObjective-Cの基本的な構文を理解しており、Cygwinをインストールして実験したいと思っています。しかし、私は2つのことがわかりません: 私は何をインポートし、 プリミティブ型の名前です。 誰かが私を助けることができますか?Objective-Cのインポート、Cygwinのプリミティブ型

答えて

1

継承できるオブジェクトはObjectです。これは、NeXTStepやCocoaのNSObjectと同程度の機能は提供していないことに注意してください。 Objectには参照カウントのようなものさえありません。 NSObjectという参照カウントのメモリ管理と同じ種類のものを取得するには、それを自分で実装する必要があります。

#import <objc/Object.h> 

@interface MyObject : Object 
{ 
    int retainCount; 
} 

- (id) retain; 
- (int) retainCount; 
- (void) release; 
@end 

@implementation MyObject 

+ (MyObject *) alloc 
{ 
    // In Cocoa, allocated objects have an implicit retain. 
    MyObject *anObject = [super alloc]; 
    anObject->retainCount = 1; 
    return anObject; 
} 

- (void) release 
{ 
    retainCount--; 
    if (retainCount == 0) 
     [self free]; 
} 

- (id) retain 
{ 
    retainCount++; 
    return self; 
} 

- (int) retainCount 
{ 
    return retainCount; 
} 
@end 


int main (int argc, char *argv[]) 
{ 
    MyObject *test = [[MyObject alloc] init]; 
    [test retain]; 
    [test release]; 
    [test release]; 
    // (test should be deallocated now) 

    return 0; 
} 

リンクする場合は、あなたが-lobjcとリンクを確認する必要があり、これはObject嘘(と思う)の場所を定義です。

他の大きなキャッチは、静的な文字列インスタンス、つまり@"like this"と表示されるコード内の文字列です。

// Let's assume that we have a protocol <MyObject> that defines all the basic methods 
// like retain, release etc. In this case, these should be no-ops because the static 
// string is never deallocated. In Cocoa, there is a protocol <NSObject> which provides 
// the same common methods. 

@interface MyStaticStringClass : Object <MyObject> 
{ 
    char *str; 
    unsigned len; 
} 
- (const char *) cString; 
@end 

@implementation MyStaticStringClass 
- (void) retain 
{ 
    return; 
} 

- (id) retain 
{ 
    return self; 
} 

- (int) retainCount 
{ 
    return INT_MAX; 
} 

- (const char *) cString 
{ 
    return str; 
} 
@end 

int main (int argc, char *argv[]) 
{ 
    id aString = @"Hello world!"; 

    fprintf (stdout, "aString has the contents: %s\n", [aString cString]); 

    return 0; 
} 

コンパイル、あなたがフラグ-fconstant-string-class=MyStaticStringClassを使用することができます:GNUランタイムを使用すると、文字列の静的インスタンスがある特定のIVARのレイアウトを、持っている必要があります。あなたは文字列クラスのために好きなメソッドを提供することができますが、それは2つだけのivarsを持っている必要があり、彼らは正しい順序でなければなりません。 Objective-Cスタイルの文字列を使用したくない場合は、静的文字列クラスを定義する必要はありません。静的文字列クラスを定義すると、動的な文字列クラス(つまり、実行時に割り当てられた文字列オブジェクト)の動作を複製できるので、どちらの場合でも使用できます。

コマンドラインユーティリティと基本的なアプリケーションについては、私はCocoaやGNUstepを使用せず、独自のクラスを定義します。これには多くの欠点がありますが、Objective-Cのオブジェクト抽象化と変成作用は、私がプログラミングしている他の言語よりも実装がずっと簡単です。

関連する問題