0

我有点迷失在对象属性的这个主题上。我的应用程序的想法是在 ViewController 中有许多函数,并通过指向函数(*攻击)的指针将它们存储在类(敌人)中。问题是通过引用此函数来传递对象。

两个类:敌人和玩家(NSObjects)

敌人.h

@property void (*attack)(Class *enemy, Class *player, int); // synthesized

视图控制器.h

@interface ViewController : UIViewController {

player *player1;
enemy *monster1;
}

@property enemy *monster1;
@property player *player1;

视图控制器.m

void attack1(enemy *attacker,player *target, int x) {

target.health = target.health - x;
NSLog(@"%i",target.health);
}

@implementation ViewController
@synthesize player1;    
@synthesize monster1;

- (void)viewDidLoad {

[super viewDidLoad];

self.player1 = [[player alloc] init];
self.monster1 = [[enemy alloc] init];

player1.health = 100;

以下两个语句不起作用:

monster1.attack = attack1;              //Error 1 (yellow)
monster1.attack(&monster1,&player1,20); //Error 2 (red)

错误 1​​说:“不兼容的指针类型分配给 'void (*)(__unsafe_unretained Class*, __unsafe_unretained Class*, int)' from 'void (enemy *_ strong, player * _strong, int)'”

错误 2说:“将 'player *__strong *' 传递给 '__unsafe_unretained Class *' 类型的参数会更改指针的保留/释放属性”(2 次)

我已经尝试将 __unsafe_unretained 放入enemy.h 中的函数或@property 之后的(nonatomic, assign) 中,但似乎没有任何效果。

4

1 回答 1

0

错误 1:Class的类型而不是任何对象实例的类型。如果您想接受可以使用的任何类的实例,id或者NSObject *用于该类型。

错误 2:monster1是类型的变量enemy *(注意:按照惯例,类以大写字母开头,使用Enemy)并且将包含对类型实例的引用enemy。该表达式&monster1计算为 的地址monster1并且是类型enemy **- 对 的引用的引用enemy。您不应该使用&运算符。

可能还有其他错误和设计问题。您似乎对 Objective-C、类、对象、引用和编码约定有一些误解;做一些学习可能是个好主意。

高温高压

于 2013-07-16T00:14:39.670 回答