0

Я как бы потерялся в этом предмете свойств объекта. Идея моего приложения состоит в том, чтобы иметь ряд функций в ViewController и хранить их с помощью указателя на функцию (* attack) в классе (враге). Проблема заключается в передаче объектов по ссылке на эту функцию.Какие свойства выбрать для передачи Классы функции

два класса: противника и игрок (NSObjects)

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

The follwing два заявления не работает:

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

Ошибка 1 говорит: «Несовместимые типы указателей относящих«пустоты (*) (__ unsafe_unretained Класс *, __unsafe_unretained Класс *, int) 'from' void (враг * _ сильный, игрок * _strong, int) '"

Ошибка 2 говорит: «Передача„игрок * __ сильными *“для параметра типа„__unsafe_unretained Класса *“изменения сохранить/релиз свойство указателей» (2 раза)

Я попытался перестановками Положив __unsafe_unretained в функцию в враге.h или (неатомное, назначить) после @property, но ничего не работает.

ответ

0

Ошибка 1: Class является тип классов не тип любого объекта экземпляров. Если вы хотите принять экземпляр любого класса, вы можете использовать id или NSObject * для типа.

Ошибка 2: monster1 является переменной типа enemy * (Примечание: классы начала конвенции с заглавной буквы, использовать Enemy) и будет содержать ссылку на экземпляр типа enemy. Выражение &monster1 оценивает на адресmonster1 и имеет тип enemy ** - ссылку на ссылку на enemy. Вы не должны использовать оператора &.

Возможно, имеются и другие ошибки & проблемы с дизайном. Похоже, у вас есть некоторые недоразумения в отношении Objective-C, классов, объектов, ссылок и соглашений о кодировании; это может быть хорошей идеей для изучения.

HTH

+0

Спасибо! Программа работает (пока).И да, есть много, чтобы узнать для меня, я знаю :) – user2583450

+0

не только это, он использует 'Class *', который является указателем на указатель на объект класса, поэтому он неверен на нескольких уровнях – newacct

Смежные вопросы