2010-10-29 2 views
0

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

У меня есть интерфейс:

@interface ControlWheel : RotatableObject <LeverSubject> 
{ 
NSMutableArray *subjectArray_; 
} 
-(id) initWithCWDef: (ControlWheelDef*) def; 
-(void) addSubject: (id) subject; 
@end 

Вот реализация:

-(id) initWithCWDef:(ControlWheelDef *)def 
{ 
    ... 
    self = [super initWithDef:&rDef]; 
    if (self) 
    { 
     subjectArray_ = [NSMutableArray arrayWithCapacity:1]; 
    } 
    return self; 
} 

-(void) addSubject:(id)subject 
{ 
    [subjectArray_ addObject:subject]; 
} 

-(void) angleChangeCallback 
{ 
    unsigned int count = [subjectArray_ count]; 
    for (unsigned int i = 0; i < count; i++) 
    { 
     [[subjectArray_ objectAtIndex:i] onAngleChanged:angle_]; 
    } 
} 

Проблема заключается в angleChangeCallback функции. subjectArray_ выходит за рамки. Что я делаю неправильно?

+0

не имеет отношения к сбою, но для включения в петлю будет убирать ваш метод angleChangeBack немного. – tapi

ответ

4

arrayWithCapacity: возвращает автореализованный массив. Вы хотите [[NSMutableArray alloc] init];.

NSMutableArray растет по мере необходимости, поэтому arrayWithCapacity: не особенно полезен, если вы не собираетесь заполнять его известным, большим количеством объектов.

О, и это не выходит за рамки; он был собран пулом авторефератов.

+0

Вы также можете просто «сохранить» массив, возвращенный из 'arrayWithCapacity'. В любом случае, не забудьте «освободить» его в методе 'dealloc' вашего объекта. – walkytalky

+0

@walkytalky: он мог бы «сохранить» массив, но здесь есть еще один аргумент: '[NSMutableArray arrayWithCapacity:]' в основном эквивалентен '[[[NSMutableArray alloc] initWithCapacity:] autorelease]'. И добавление сохранения к этому было бы просто глупо. В принципе, ему не нужен бит 'WithCapacity: ', и он должен просто избавиться от него. –

+0

Ужасно много методов класса удобства в Cocoa эквивалентны последовательности 'alloc' /' initXXX'/'autorelease', а добавление' keep' - довольно распространенная идиома. Вы запускаете кампанию против всей этой картины? Это правда, здесь здесь избыточно, но стоимость невелика с точки зрения как обработки, так и сложности кода. И что, если значение '1' было замещающим значением, которое, как ожидается, будет заменено позже каким-то огромным неизвестным количеством? – walkytalky

0

Это не похоже, что у вас есть angleChangeCallback, определенный в вашем интерфейсе вверху. Я вижу addSubject и initWithCWDef, но не он.

+0

Он определен в протоколе – Andrew

+0

, даже если метод не объявлен в блоке @interface, он будет рассматриваться как метод класса, а его реализация в классе @ implementation/@ end block – Vladimir

+0

. Я должен избегать публикации рано утром. –

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