-1

我有一个准备推出的安卓游戏,我目前正在努力将它移植到 iOS。

总的来说,我对 Objective C 和 C 还很陌生,我不确定 @properties 和 @synthesize 以及 #imports 是如何工作的。

我的游戏共享一个名为 gMain 的方法文件。该文件包括对象之间的共享方法。我有一个名为 Fish 的对象,其中包含一个方法,该方法需要另一个名为 Fish2 的对象的 x,y 值。

当 Fish 和 Fish2 共享相同的变量名 int x、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

我不确定您是否要处理一个类,两个实例,两个单独的类。我将尝试给出每个示例,并尝试解释代码在做什么。

单类,两个实例

鱼.h

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

因此,您正在定义一个名为 FishA 的新对象,该对象有 2 个公共属性,x 和 y。括号中的 2 项 nonatomic 和 assign 告诉编译器有关属性的额外信息。Bassicalynonatomic意味着不担心线程安全,assign意味着属性是基本类型,而不是对象。

鱼米

#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语句将为您创建两种方法,一种用于设置值,另一种用于获取值。在上面的语句中,告诉编译器为属性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];
}

单独的类

鱼A.h

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

FishA.m

#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)
}

鱼B.h

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

颜色属性看起来有点不同。因为颜色是一个对象而不是基本类型,我们需要告诉编译器我们想要如何处理它。告诉编译器保留这个strong对象,直到我们完成它。另一个选项是weak并且告诉编译器不要保留对象。一般来说,与对象,使用强。

鱼B.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)
}

所以我创建了两个独立的类,FishA 有一个 size 属性,FishB 有一个 color 属性。两条鱼都具有 x 和 y 属性。并不过分令人兴奋,但它使两个课程有所不同。

采用

#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 回答