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



我已经准备好推出一款android游戏,目前正在将其移植到iOS。

一般来说,我对Objective C和C相当陌生,我不确定@properties和@synthesis以及#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

这是从两个对象合成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

我不确定您是否想要处理一个类,两个实例,两个独立的类。我将尝试给出每种代码的示例,并尝试解释代码的作用。

单个类,两个实例

Fish.h

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

因此,您正在定义一个名为FishA的新对象,该对象有两个公共属性,x和y。括号中的两个项是非原子的,assign告诉编译器关于这些属性的额外信息。Bassically 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,它告诉编译器不要保留这个对象。一般来说,对于反对者,使用强。

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
}

这将不适用于

    -(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应该继承Fish?

这有帮助吗?

相关内容

  • 没有找到相关文章

最新更新