2010-07-13 2 views
0

Действительно, кто-то может помочь мне разобраться, почему отправка объектов, являющихся членами массива, кажется самым сложным в мире в Obj-C.Отправка сообщения объекту, входящему в массив

Вот установка: у меня есть класс автомобиля. Автомобиль имеет два объекта-члена, двигатель и шину (из них четыре). Затем у меня есть NSArray (также член автомобиля), инициализированный для хранения объектов шины. Я сделал это, потому что я не могу понять, как писать или синтезировать методы геттер для только декларирует как Тир * шины [4] (так что я должен использовать NSArray и использовать objectAtIndex

Вот класс автомобиля:.

#import "Tire.h" 
#import "Engine.h" 

@interface Car : NSObject 
{ 
    Engine *engine; 
    Tire *tire1; 
    Tire *tire2; 
    Tire *tire3; 
    Tire *tire4; 
    NSArray *tirearray; 
} 

@property (nonatomic, copy) id engine; 
@property (nonatomic, copy) id tire; 
@property (nonatomic, copy) id tirearray; 

@implementation Car 

@synthesize engine; 
@synthesize tire; 
@synthesize tirearray; 

- (void) print { 

    NSLog(@"%@", engine); 

} 

- (id) init { 

    if (self = [super init]) { 
     engine = [Engine new]; 
     tire1 = [[tire alloc] init]; 
     tire2 = [[tire alloc] init]; 
     tire3 = [[tire alloc] init]; 
     tire4 = [[tire alloc] init]; 
     tirearray = [NSArray arrayWithObjects: tire1, tire2, tire3, tire4, nil]; 
    } 

    return (self); 

} 

Тогда главная:

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    Car *car = [[Car alloc] init]; 

    [[car.tirearray objectAtIndex:0] setPressure: 32]; 


    [pool drain]; 
    return 0; 
} 

То, что я пытаюсь сделать, это выяснить, как отправлять сообщения на объекты в массиве Это все, что я хочу сделать, приведенный выше код создает, но возвращает неперехваченное исключение!. «NSRangeException», причина: «*** - [NSArray objectAtIndex:]: индекс (0) за пределами (0) '!!!

Как вы знаете, давление является просто переменной, входящей в класс шин, и были синтезированы методы геттера.

Затем я хочу напечатать что-то на консоли, например, «Давление шины X X PSI».

Это сводит меня с ума! Это должно быть просто! Аааа.

Заранее спасибо!

ответ

0

О, человек. Я чувствую себя настолько глупо. Я не инициализировал массив вообще! Мне нужно затем инициализировать initWithObjects. Ха-ха. К сожалению.

+0

Но у меня все еще есть ошибка. Пожалуйста помоги!!! –

+0

1. Не пишите ответа, изменяйте вопрос. 2. Какая ошибка вы сейчас получаете и где? – JeremyP

+0

Спасибо. Я только начал использовать StackOverflow и не совсем понял, как его использовать. Я запомню это! «Ответ» отличается от комментария. Получил это: P –

1

Код

 tire1 = [[tire alloc] init]; 

должен быть

 tire1 = [[Tire alloc] init]; 

Кто вам сказал, чтобы объявить свойство как id? Это очень, очень, очень плохая практика, и вы должны остановить ее сейчас. Прямо сейчас.

Если вы купили учебник, который говорит так, пожалуйста, просто сжечь его до пепла.

Объявив ваше имущество

@property (nonatomic, copy) Tire* tire; 

компилятор предупредит вас в

 tire1 = [[tire alloc] init]; 

говоря, что tire не реагирует на alloc.

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