-1

Androidゲームを起動する準備ができており、現在iOSへの移植に取り組んでいます。

私はObjectiveCとC全般にかなり慣れていないので、@propertiesと@synthesizeと#importsがどのように機能するのか正確にはわかりません。

私のゲームはgMainというメソッドファイルを共有しています。このファイルには、オブジェクト間の共有メソッドが含まれています。Fishというオブジェクトがあり、そのオブジェクトには、Fish2という別のオブジェクトのx、y値を必要とするメソッドが含まれています。

FishとFish2の両方が同じ変数名intx、int yを共有している場合に、変数にアクセスする方法がわかりません。

これは機能しますか?

//Fish.h 
@interface Fish 
{
     int x, y; 
} 
@property int x, y; 
-(void)blah;
@end  


//Fish2.h
@interface Fish2
{
    int x, y;
}
@property int x, y; 
@end    


//Fish.m 
#import Fish.h 
@implementation Fish  
@synthesize x, y;

-(void)blah
{
    x = Fish2.x;
    y = Fish2.y;
}
@end 


//Fish2.m
#import Fish2.h
@implementation Fish2
@synthesize x, y;
@end
4

3 に答える 3

1

これは 2 つのオブジェクトから xs と ys の両方を合成しますか?

いいえ。

あなたのコードはコンパイルされません。どのクラスについて話しているかをコンパイラに伝える@interface@implementation、およびディレクティブをすべて省略しました。ディレクティブは常に と の間に含まれ@end、指定されたクラスのプロパティのみを合成します。@synthesize@implementation *classname*@end

コードを修正すれば、その効果は@synthesize明ら​​かです。

//Fish.h
@interface Fish
{
    int x, y;
}
@property int x, y;

@end

//Fish.m
#import Fish.h
#import Fish2.h       // it's not clear why you'd need this

@implementation Fish

@synthesize x, y;     // creates accessors for properties x and y of class Fish

@end
于 2012-09-07T17:18:52.490 に答える
0

これは機能しません

    -(void)blah
{
    x = Fish2.x;
    y = Fish2.y;
}

Fish2 のポインターを作成する必要があります。このようなもの...

    -(void)blah
{
    Fish2 *selectedFish = //wherever the instance of the fish is.
    x = selectedFish.x;
    y = selectedFish.y;
}

Fish が fish2 のインスタンスを作成する場合、おそらくこのようなことを行うとより役立つでしょう。

    -(void)blahWithFish:(Fish2)currentFish
{
    x = currentFish.x;
    y = currentFish.y;
}

そのようなことをすると、魚をこのメソッドに渡すことができます。

また、fish2の理由はありますか?2 つの魚オブジェクトを作成しているだけではありませんか? 彼らは同じタスクを実行しますか? 多分fish2はFishから継承するべきですか?

それは役に立ちますか?

于 2012-09-07T18:26:18.397 に答える
0

単一のクラス、2 つのインスタンス、2 つの別個のクラスを扱いたいのかどうかはわかりません。それぞれの例を挙げて、コードが何をしているかを説明しようとします。

単一クラス、2 つのインスタンス

フィッシュ.h

@interface Fish : NSObject
@property (nonatomic, assign) int x;
@property (nonatomic, assign) int y;
- (void) someMethod;
@end

つまり、FishA という名前の新しいオブジェクトを定義しており、そのオブジェクトには x と y の 2 つのパブリック プロパティがあります。括弧内の nonatomic と assign の 2 つの項目は、プロパティに関する追加情報をコンパイラに伝えます。基本nonatomic的には、スレッド セーフについて心配する必要はなくassign、プロパティがオブジェクトではなく基本型であることを意味します。

魚.m

#import "Fish.h"

@implementation Fish
@synthesize x = _x;
@synthesize y = _y;

- (id) init {
    self = [super init];
    if (self) {
        // Initilize default values
        // Only use the _x and _y in init
        // no other place
        _x = 0;
        _y = 0;
    }
    return self;
}

- (void) someMethod {
    // Set the values
    self.x = 10;
    self.y = 10;

    // Access the values
    NSLog(@"X: %d", self.x)
    NSLog(@"Y: %d", self.y)
}

したがって、@synthesizeステートメントは、値を設定するメソッドと値を取得するメソッドの 2 つのメソッドを作成します。上記のステートメントでは、プロパティxのメソッドを作成するようにコンパイラに指示しています。 は、プロパティの内部ストレージ変数の名前です。プロパティと内部ストレージに別々の名前を付ける方がはるかに優れています。これにより、コードがよりクリーンになり、何が起こっているのかを理解しやすくなります。x_x

このinitメソッドでは、内部変数に初期値を直接設定します。initメソッドは通常、内部変数にアクセスする唯一の場所です。

使用する

#import "Fish.h"

- (void) example {
    Fish *fishA = [[Fish alloc] init];
    Fish *fishB = [[Fish alloc] init];

    fishA.x = 10;
    fishB.x = 20;

    [fishA someMethod];
    [fishB someMethod];
}

クラス分け

FishA.h

@interface FishA : NSObject
@property (nonatomic, assign) int x;
@property (nonatomic, assign) int y;
@property (nonatomic, assign) int size;
- (void) someMethod;
@end

フィッシュアム

#import "FishA.h"

@implementation FishA
@synthesize x = _x;
@synthesize y = _y;
@synthesize size = _size;

- (id) init {
    self = [super init];
    if (self) {
        // Initilize default values
        // Only use the _x and _y in init
        // no other place
        _x = 0;
        _y = 0;
        _size = 10;
    }
    return self;
}

- (void) someMethod {
    // Set the values
    self.x = 10;
    self.y = 10;

    // Access the values
    NSLog(@"X: %d", self.x)
    NSLog(@"Y: %d", self.y)
}

FishB.h

@interface FishB : NSObject
@property (nonatomic, assign) int x;
@property (nonatomic, assign) int y;
@property (nonatomic, strong) NSColor *color;
- (void) someMethod;
@end

色の特性は少し異なります。color はオブジェクトであり、基本型ではないため、コンパイラに処理方法を伝える必要があります。は、処理が完了するまでこのstrongオブジェクトを保持するようにコンパイラに指示します。もう 1 つのオプションはweakand で、コンパイラにオブジェクトを保持しないように指示します。一般的に言えば、オブジェクトでは strong を使用します。

FishB.m

#import "FishB.h"

@implementation FishB
@synthesize x = _x;
@synthesize y = _y;
@synthesize color = _color;

- (id) init {
    self = [super init];
    if (self) {
        // Initilize default values
        // Only use the _x and _y in init
        // no other place
        _x = 0;
        _y = 0;
        _color = [NSColor blueColor];
    }
    return self;
}

- (void) someMethod {
    // Set the values
    self.x = 10;
    self.y = 10;

    // Access the values
    NSLog(@"X: %d", self.x)
    NSLog(@"Y: %d", self.y)
}

そこで、2 つの別個のクラスを作成しました。FishA には size プロパティがあり、FishB には color プロパティがあります。どちらの魚も x プロパティと y プロパティを持っています。あまりエキサイティングではありませんが、2 つのクラスの違いを生んでいます。

使用する

#import "FishA.h"
#import "FishB.h"

- (void) example {
    FishA *fishA = [[FishA alloc] init];
    FishB *fishB = [[FishB alloc] init];

    fishA.x = 10;
    fishB.x = 20;

    fishA.size = 50; // Works
    fishB.size = 50; // Will not work

    fishA.color = [NSColor redColor]; // Will not work
    fishB.color = [NSColor redColor]; // Works
}
于 2012-09-07T18:45:47.563 に答える