我已经准备好推出一款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?
这有帮助吗?