Оператор labs = [[NSMutableArray alloc] init];
заставляет labs
указывать на новый массив в области действия метода. Это не делает указатель вызывающей стороны указывать на новый массив.
Если вы хотите изменить указатель вызывающего абонента, сделайте что-то вроде этого:
// The caller
NSMutableArray *labels; // Don't initialize *labels.
[self processLabels:&labels];
...
- (void)processLabels:(NSMutableArray**)labs{
*labs = [[NSMutableArray alloc] init];
[*labs addObject:@"Random"];
...
}
Это, вероятно, плохая идея, поскольку processLabels:
выделяет массив, но вызывающий отвечает за его освобождение.
Если вы хотите, чтобы вызывающая сторона владела массивом, вы можете написать processLabels:
следующим образом:
- (void)processLabels:(NSMutableArray*)labs{
[labs removeAllObjects];
[labs addObject:@"Random"];
...
}
Или, если processLabels:
просто возвращает коллекцию меток:
- (NSMutableArray*)processLabels {
NSMutableArray* labs = [[[NSMutableArray alloc] init] autorelease];
[labs addObject:@"Random"];
...
return labs;
}
Если вы хотите, чтобы вызывающая сторона отвечала за освобождение массива, удалите авторелиз. В этом случае соглашение предписывает, чтобы имя метода начиналось с alloc
или new
или содержало слово copy
.