Отправка сообщения объекту, который является членом массива - PullRequest
0 голосов
/ 13 июля 2010

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

Вот настройка: у меня есть класс автомобиля. У автомобиля есть два объекта участника, двигатель и шина (из которых четыре). Затем у меня есть NSArray (также член автомобиля), инициализированный для хранения объектов шин. Я сделал это, потому что я не могу понять, как написать или синтезировать методы получения для простого объявления как шины Tire * [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:]: index (0) за пределами границ (0)» !!!

Как вы знаете, давление - это просто переменная-член класса шин, и методы получения были синтезированы.

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

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

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

Ответы [ 2 ]

1 голос
/ 13 июля 2010

код

        tire1 = [[tire alloc] init];

должно быть

        tire1 = [[Tire alloc] init];

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

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

объявив вашу собственность

 @property (nonatomic, copy) Tire* tire; 

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

        tire1 = [[tire alloc] init];

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

0 голосов
/ 13 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...