2012-02-27 4 views
2

Привет, ребята, я пытаюсь создать базу данных, которая отображает NSStrings в int. Я имею в классе под названием Movie.h, где каждый объект имеет имя и номер, присвоенный:Проблемы с массивом типа class

//Movie.h 
@interface Movie : NSObject 
{ 
    int m_num; 
    NSString *m_name; 
} 
@property int m_num; 
@property(nonatomic, retain) NSString *m_name; 
@end 

//Movie.m 
@implementation Movie 
@synthesize m_num, m_name; 
@end 

я тогда еще один класс называется Map, где я реализующий функции, чтобы играть с моим «Фильмы». Одна из функций называется insert, и она вставляет объект класса movie в массив, где должны храниться все фильмы. Код компилируется, но мой «m_array», похоже, не ведет запись того, что я добавляю к нему. Вот код:

//Map.h 
#import "Movie.h" 
@interface Map : NSObject 
{ 
@private 
    int m_count; 
    NSMutableArray *m_array; 
} 
@property int m_count; 
@property(nonatomic, retain) NSMutableArray *m_array; 
-(bool) contain: (NSString *) name; 
-(bool) insert: (NSString *) name: (int) chap; 
@end 

//Map.m 
@implementation Map 
@synthesize m_count, m_array; 

//Constructor 
-(id) init{ 
    if (self = [super init]){ 
     m_count = 0; 
    } 
    return self; 
} 
-(bool) contain: (NSString *) name{ 
    bool b = false; 
    for (int i = 0; i < m_count; i++) { 
     Movie *m = [[Movie alloc]init]; 
     m = [m_array objectAtIndex:i]; 
     NSLog(@"%@ came out in %i", m.m_name, m.m_num); 
     if (m.m_name == name) { 
      b = true; 
     } 
    } 
    return b; 
} 
-(bool) insert:(NSString *) name: (int) chap{ 
    Movie *m1 = [[Movie alloc]init]; 
    m1.m_name = name; 
    m1.m_num = chap; 
    [m_array addObject:m1]; 
    NSLog(@"Here is the object %@",[m_array objectAtIndex:m_count]); 
    m_count++; 
    return true; 
} 
@end 

-(bool) upgrade:(NSString *)name :(int)chap{ 
    if(![self contain:name]) 
     return false; 
    for (int i = 0; i < m_count; i++){ 
     Movie *m = [[Movie alloc]init]; 
     m = [m_array objectAtIndex:i]; 
     if(m.m_name == name) 
      m.m_num = chap; 
    } 
    return true; 

}

Вот мой главный:

//main.m 
#import "Map.h" 

int main (int argc, const char * argv[]) 
{ 
    @autoreleasepool 
    { 
     Map *m = [[Map alloc]init]; 
     [m insert:@"James Bond" :2001]; 
     if (![m contain:@"James Bond"]) { 
      NSLog(@"It does not work"); 
     } 
    } 
    return 0; 
} 

Вот консольный вывод:

2012-02-27 14:20:04.923 myMap[3926:707] Here is the object (null) 
2012-02-27 14:20:05.036 myMap[3926:707] (null) came out in 0 
2012-02-27 14:20:05.037 myMap[3926:707] It does not work 
+1

Почему у вас есть переменная 'm_count'? Просто используйте метод 'count' массива. –

+0

О, ты прав. Я делаю это, потому что я уже закончил этот класс на C++, я просто переписываю код в объективе-C. – solalito

ответ

2

Похоже, что вы забыли создать массив:

- (id)init 
{ 
    self = [super init] 
    if (nil != self) { 
    m_count = 0; 
    m_array = [NSMutableArray new]; << here 
    } 
    return self; 
} 

Не создавая его, это просто nil.

+0

Спасибо! Также есть более простой способ получить доступ к частному члену моего объекта или мне нужно делать то, что я делаю в своей функции вставки, то есть создать новую переменную фильма для хранения в m_name и m_num в ней? – solalito

+0

@ пользователь1236187 приветствуется. как правило, вы бы предложили правильный инициализатор ('- (id) initWithNumber: (int) inNumber name: (NSString *) inName') или иногда конструктор удобства:' + (Movie *) newMovieWithNumber: (int) inNumber name: (NSString *) inName {Movie * movie = [Movie new]; movie.number = inNumber; movie.name = inName; возврат фильма; } '. При правильном инициализаторе конструктор удобства будет просто однострочным. – justin

+0

и как я могу использовать это, если, например, я хотел бы обновить год, присвоенный определенному фильму? Я только что опубликовал свою функцию «обновления» в своем первом сообщении выше. – solalito

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