2009-07-13 1 views
1

Итак, у меня есть код ниже (Objective-C FYI), и мне было интересно, хочу ли я создать объект NSMutableArray из c_data, как бы я мог это сделать ? Это похоже на объявление List<c_data> cData в C#.Создание массива, содержащего только объекты данного класса

@interface c_data : NSObject { 
    double value; 
    int label; 
    int ID; 
}  
@property double value; 
@property int label; 
@property int ID; 

-(c_data*) init; 
-(c_data*) initWithValue:(double)value;  
@end 

@implementation c_data 
@synthesize value, label, ID; 
-(c_data*) init { 
    return self; 
} 
-(c_data*) initWithValue:(double)val { 
    value = val; 
    return self; 
} 
@end 

Если посмотреть на класс feat_data, я пытаюсь сделать cData массив из класса c_data. Я включил свои попытки, но я не думаю, что это правильно, потому что c_data не является массивом. Какие-либо предложения?

@interface feat_data : NSObject { 
    NSMutableArray *nData; 
    NSMutableArray *cData; 
    char type; 
} 
@property(nonatomic, retain) NSMutableArray *nData; 
@property(nonatomic, retain) NSMutableArray *cData; 
@property char type; 
-(feat_data*)init; 
@end 

@implementation feat_data 
@synthesize nData, cData, type; 
-(feat_data*)init { 
    nData = [[NSMutableArray alloc] init]; 
    c_data *c_dataInstance = [[c_data alloc] init]; 
    cData = [[NSMutableArray alloc] initWithArray:c_dataInstance]; 
    return self; 
} 
@end 
+2

Не ответ, а комментарий: Имя класса «c_data» находится вне пределов соглашений Objective-C.Названия классов должны быть в CamelCase, начиная с прописной буквы. – Chuck

+0

Примечание: В связи с этим вопросом SO - http://stackoverflow.com/questions/1120067/ –

ответ

2
[NSMutableArray addObject:[[[c_data alloc] init] autorelease]]; 

Объективы-C массивы не печатаются. Кажется, у вас есть C++ unlearning.

Относительно примечания, ваши подходы довольно плохие. Вы должны вызвать супер инициализации, а также, как таковой:

- (id)init { 
    self = [super init]; 
    if (self != nil) { 
    //Initialize here. 
    } 
    return self; 
} 
+0

ах, спасибо за помощь. На родственной, но совершенно другой теме, какую книгу на C++ вы бы предложили покупать, которая охватывает большинство концепций программирования? Тот, который я получил через синтаксис довольно хорошо, но это все. Это не обсуждает многое в прошлом. Я не против платить огромную цену, если это отличная книга. –

+1

Вы спрашиваете не того парня. Я бы рекомендовал не покупать книгу на C++ вообще. Но если бы вы имели в виду, что * Objective-C * книга я бы предложил; Я бы сказал, что долгое время смотрел ссылки на программирование Apple на http://developer.apple.com/, это хорошее начало. –

+1

Это утечка памяти, если вы не используете сбор мусора. Вам нужно освободить объект после добавления его в массив. – Chuck

2

Вы бы создать NSMutableArray и вставить c_data объекты в него.

3

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

Если вы думаете об этом, один из Самые большие преимущества для генериков - возможность извлекать объекты из коллекции непосредственно в статически типизированную переменную без кастинга. В Objective-C вы можете просто сохранить переменную id и отправить любое сообщение, которое вам нравится, не беспокоясь об исключении ClassCastException, или компилятор, жалующийся на то, что объект не может (не может?) Реализовать метод, который вы пытаетесь вызвать. Вы можете по-прежнему статически вводить переменные и приносить результаты, если это необходимо, но более простой подход - использовать динамическую типизацию (и -isKindOfClass: и -respondsToSelector: при необходимости).

Кстати, есть несколько связанных воплощений этого вопроса о переполнении стека. Знание термина (ов) для поиска («общий», «строго типизированный» или «шаблон») может помочь найти их. Вот некоторые из них:

Наконец, я согласен с Уильямом - ваши методы инициализации довольно вопиющие в образце предоставленных вами. Вы бы хорошо научились и прислушались к правилам Apple от Allocating and Initializing Objects в Objective-C. Это требует взлома привычек с других языков, но это сэкономит вам бесконечные часы безумия в какой-то момент по дороге. :-)

+0

Спасибо. Я заметил, что вы ответили на несколько моих вопросов в прошлом. Вы очень помогли мне этим летом. –