2014-10-30 7 views
-2

Я новичок в object-C, и я пытаюсь добавить объекты к экземпляру переменной NSMutableArray. Так или иначе объекты (элемент) можно передать в метод setSubItems, но массив _subItems всегда возвращает «nil».NSMutableArray addObject: не работает

Вот файл заголовок:

@interface SUKContainer : SUKItem 
{ 
    NSMutableArray *_subItems; 
} 
-(void)setSubItems:(id)object; 
@end 

реализация:

@implementation SUKContainer 
-(void)setSubItems:(id)object 
{  
    [_subItems addObject:object]; 
} 
@end 

главный:

SUKContainer *items = [[SUKContainer alloc] init];  
for (int i = 0; i < 10; i++) 
{ 
    SUKItem *item = [SUKItem randomItem]; 
    [items setSubItems:item]; 
} 

спасибо много за вашу помощь!

+0

Возможно, вы должны создать массив объект. –

ответ

1

Попробуйте изменить его на следующий код

@interface SUKContainer : SUKItem 

// The ivar will be created for you 
@property (nonatomic, strong) NSMutableArray *subItems; 

// I'd change the name to addSubItem as it makes more sense 
// because you aren't setting subItems you're adding a subItem 
-(void)addSubItem:(id)object; 
@end 

@implementation SUKContainer 

// No need for a synthesize as one will auto generate in the background  

- (instancetype)init 
{ 
    if (self = [super init]) { 
     // Initialize subItems 
     self.subItems = [[NSMutableArray alloc] init]; 
    } 

    return self; 
} 

- (void)addSubItem:(id)object 
{  
    if (_subItems == nil) { 
     // If the array hasn't been initilized then do so now 
     // this would be a fail safe I would probably initialize 
     // in the init. 
     _subItems = [[NSMutableArray alloc] init]; 
    } 

    // Add our object to the array 
    [_subItems addObject:object]; 
} 

@end 

Потом где-то в вашем коде вы можете сделать

SUKContainer *items = [[SUKContainer alloc] init];  
for (int i = 0; i < 10; i++) { 
    SUKItem *item = [SUKItem randomItem]; 
    [items setSubItems:item]; 
} 

Чтобы быть честным, хотя, вероятно, можно просто сделать ниже, и это выглядит чище, то имеющий другой метод под названием addSubItem:

SUKContainer *items = [[SUKContainer alloc] init]; 

// If subItems hasn't been initialized add the below line 
// items.subItems = [[NSMutableArray alloc] init]; 

for (int i = 0; i < 10; i++) { 
    [items.subItems addObject:[SUKItem randomItem]]; 
} 
+0

Я думал, что [[SUKContainer alloc] init] инициализирует переменную экземпляра SUKContainer, а? И спасибо вам большое. оно работает!! – Roy

+0

Только если вы сами написали свой метод 'init', иначе он просто вызовет супер. Добавлен простой метод init для кода – Popeye

+0

Но если вы используете items.subItems, не будет ли точечная нотация вызывать метод setSubItems по умолчанию? – Roy

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