0

このオブジェクト プロパティの主題について、私はちょっと迷っています。私のアプリのアイデアは、ViewController に多数の関数を持ち、関数へのポインタ (*attack) を介してクラス (敵) に格納することです。問題は、この関数への参照によってオブジェクトを渡すことです。

2 つのクラス: 敵とプレイヤー (NSObjects)

敵.h

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

ViewController.h

@interface ViewController : UIViewController {

player *player1;
enemy *monster1;
}

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

ViewController.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;

次の 2 つのステートメントは機能しません。

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

エラー 1は、「互換性のないポインター型が 'void (*)(__unsafe_unretained Class*, __unsafe_unretained Class*, int)' から 'void (enemy *_ strong, player * _strong, int)' に代入しています」

エラー 2 : 「'player *__strong *' をタイプ '__unsafe_unretained Class *' のパラメーターに渡すと、ポインターの保持/解放プロパティが変更されます」(2 回)

@property の後に __unsafe_unretained または (非アトミック、割り当て) の関数に __unsafe_unretained を配置する順列を試しましたが、何も機能していないようです。

4

1 に答える 1

0

エラー 1:オブジェクトインスタンスの型ではなく、クラスClassの型です。任意のクラスのインスタンスを受け入れたい場合は、または型に使用できます。idNSObject *

エラー 2:monster1は type の変数でありenemy *(注: クラスは慣例により大文字で始まり、 を使用しますEnemy)、 type のインスタンスへの参照が含まれますenemy。式は のアドレス&monster1評価され、型はへの参照への参照です。演算子を使用しないでください。monster1enemy **enemy&

おそらく他のエラーと設計上の問題があります。あなたは、Objective-C、クラス、オブジェクト、参照、およびコーディング規約について誤解しているようです。勉強してみるのもいいかもしれません。

HTH

于 2013-07-16T00:14:39.670 に答える