0

正しい用語を使用したかどうかはわかりませんが、昨日客観的な実験を始めたばかりで、ac# のバックグラウンドから来たので、c# の用語を使用する可能性があることを理解してください。

とは言うものの。私は2つのクラスを持っています。他のクラスをプロパティとして使用する 1 つのメイン クラス:

@class Fighter;
@interface Match : NSObject{
    int Id;
    Fighter *Fighter;
    int FScore;
}
@property int Id, FScore;
@property Fighter *Fighter;

@end

*実装:

@implementation Match
@synthesize Id, FScore, Fighter;    
@end

これは参照されるクラスです:

@interface Fighter : NSObject{
    int Id;
    NSString *Name;
}
@property int Id;
@property NSString *Name;
@end


@implementation Fighter
@synthesize Id, Name;
@end

これがオブジェクトのインスタンスを作成する方法です

@autoreleasepool {

        // insert code here...
        NSLog(@"Hello, World!");

        Match *match = [[Match alloc]init];
        match.Id = 1;
        match.Fighter = [[Fighter alloc]init];
        match.Fighter.Id = 9;
        match.Fighter.Name = @"womp";
    }

ここで、ファイター インスタンスに値を割り当てる際にショートカットのようなものがあるかどうか疑問に思っていました。c# のように、次のようなことができます。

match.Fighter = new Fighter{ Id = 9, Name = "womp" };

そのクラスまたは他のクラスにさらにいくつかのプロパティを追加する可能性がある場合に備えて知りたいです。

PS。

[Class new] より [[Class alloc] init] を使用した方が良いですか??

ありがとう!!!

4

1 に答える 1

1

Objective-Cでこれを行う一般的な方法は、-init初期化するプロパティの引数を使用してカスタムメソッドを作成することです。したがって、次のような-[Fighter initWithID:name:]方法があります。

- (id)initWithID:(NSInteger)id name:(NSString *)name
{
    self = [self init];
    if (self) {
        self.ID = id;
        self.name = name;
    }
    return self;
}

次に、次のコマンドを使用して戦闘機オブジェクトを作成します。

match.fighter = [[Fighter alloc] initWithID:9 name:@"womp"];

あなたのコードについていくつかコメントします。Objective-Cでは、プロパティ名を小文字で始めるのが慣例です。例外は、プロパティの名前が「ID」や「URL」などの頭字語である場合です。この場合、すべて大文字にします。これは、メソッド名と変数名にも当てはまります。大文字の名前は、クラス名(「ファイター」など)を含むタイプ用に予約されています。

PSの質問に関しては、+newallocを呼び出してからinitを呼び出して結果を返すだけなので、まったく同じです。とは言うものの、+ newはObjective-Cプログラマーの間ではあまり一般的に使用されておらず、alloc/initがはるかに頻繁に使用されていることがわかります。

最後に、最新のObjective-Cランタイム(10.6以降および64ビット)を使用してターゲットにデプロイする場合、コンパイラーがインスタンス変数を合成(作成)するため、インスタンス変数を明示的に宣言して@propertiesをバックアップする必要はありません。あなたのために。Xcodeの最近のバージョン(4.4以降)では、@ synthesizeステートメントも必要ありません。これは、コンパイラーがそれらを挿入するためです。@propertyステートメントだけで十分です。

于 2012-11-08T23:11:23.363 に答える