我已准备好启动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
答案 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
}