目标C - 导入具有相同变量名称的标头

时间:2012-09-07 17:05:31

标签: objective-c ios

我已准备好启动Android游戏,我正在努力将其移植到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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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?

这有帮助吗?

答案 2 :(得分:0)

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

单班,两个实例

<强> Fish.h

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

所以你定义了一个名为FishA的新对象,该对象有2个公共属性x和y。 parenthisis中的2个项目是非原子的,并且指定编译器有关属性的额外信息。 Bassicaly nonatomic表示不担心线程安全,assign表示该属性是基类型,而不是对象。

<强> Fish.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个参数将为您创建两个方法,一个用于设置值,另一个用于获取值。在上面的语句中,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

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

<强> FishB.h

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

颜色属性看起来有点不同。因为颜色是一个对象而不是一个基类型,我们需要告诉编译器我们想要如何处理它。 strong告诉编译器保持这个对象,直到我们完成它。另一个选项是weak,它告诉编译器不要保留对象。一般来说,使用objectes,使用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)
}

所以我创建了两个单独的类,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
}