Я объявляю свой массив в моем * .h файле:
@interface aViewController: UIViewController
{
NSMutableArray *anArray; // You will need to later change this many times.
}
@end
Я выделяю для этого память своим * .m файлом:
-(void) viewDidLoad
{
anArray = [[NSMutableArray alloc] init];
}
Я нажимаю тестовую кнопку для загрузки моего массива (в конечном итоге ему нужно будет загрузить значения DIFFERNT
на каждый клик):
anArray = [NSMutableArray arrayWithObjects:@"one", @"two", @"three", nil];
И я освобождаю его здесь:
-(void) dealloc
{
[anArray release];
[super dealloc];
}
Все это выглядит нормально?
Потому что происходит сбой при последующем запуске этого кода:
NSLog(@"%d", [anArray count]);
Не уверен, почему простой "NSLog () и count" может привести к краху всего.
Dirk
Позвольте мне выразиться так: у меня ОГРОМНОЕ неправильное понимание указателей, массивов, строк и памяти.
Я прочитал все, что могу найти на нем ... но (пока), чтобы найти простое, ясное и понятное описание.
Можете ли вы предложить один? (Надеюсь, менее 10 страниц чтения.)
Есть ли ссылка, которая объясняет JUST эту тему ... и с точки зрения "у вас есть 12-летний опыт программирования ... но НИЧЕГО, что когда-либо касалось выделения памяти или указателей".)
То есть имя переменной НЕ как я ссылаюсь на объект?
Тогда зачем это?
Я привык ко многим другим языкам, которые просто делают это:
myString = "this"
myString = "that"
myInt = 5
myInt = 15
(Что может быть проще.)
Похоже, это был бы самый простой способ сделать это.
(И это похоже на работу. Но это действительно правильно?)
Don't alloc any memory for my NSMutableArray initially.
Don't re-alloc any memory repeatedly. (When I change my array's values.)
Don't release it repeatedly. (Before I change my array's values.)
Don't release it when I exit the program.
But:
Always remember to use RETAIN when I initially assign
(and repeatedly reassign) new values to my anArray variable.
Вы не загружаете свой массив
anArray = [NSMutableArray arrayWithObjects: @ "один", @ "два", @ "три", ноль];
Вместо этого вы заменяете его новым экземпляром, а еще хуже - экземпляром, чей
ссылка фактически принадлежит какой-то организации, которой вы не управляете
Wow. Таким образом, у меня может быть 20 массивов ... все они называются одинаково: anArray ... и все они будут разными? (Нет такого понятия, как массив GLOBAL?)
и т.д.. Для удаления старых значений может быть полезен метод removeAllObject.
Существуют также методы мутации, которые можно использовать для добавления нескольких значений одновременно.
Итак ... сначала я должен "удалить все объекты" ... а затем я могу вызвать метод ONE , чтобы заново добавить все мои новые значения.
anArray = [[NSMutableArray arrayWithObjects: @ "one", @ "two", @ "three", nil] retain];
вместо последовательности alloc / init.
Ничего себе. Я думал, что ничто не может быть сохранено в массиве без выделения места для него.
Если вы действительно намереваетесь заменить весь массив, вы можете рассмотреть
используя свойства
Как бы я это сделал, используя свойства?
Как правильно сделать что-то вроде этого:
> anArray = [NSMutableArray arrayWithObjects:@"one", @"two", @"three", nil];
> anArray = [NSMutableArray arrayWithObjects:@"four", @"five", @"six", nil];
Точно так же, как я бы сделал:
x = 12;
x = 24;
Ничего себе. Я ДЕЙСТВИТЕЛЬНО совершенно неправильно понял все, что касается строк, массивов и памяти.
Я подумал, что «легкий путь» - выделить ОДИН РАЗ ... использовать изменяемый массив ... изменить его так, как вы хотите ... и освободить ОДИН РАЗ.
Проблема в том, что этот новый массив не сохраняется,
Я бы подумал, что старый массив исчезнет ... и можно будет использовать новый массив.
(Но, наверное, нет.)
Кроме того, у вас есть утечка памяти, потому что вы никогда не освобождали исходный массив.
Я думал, что старый массив не должен быть освобожден ... Я с этим не закончил ... Я просто хочу изменить его, чтобы он содержал мои новые значения. (Но я думаю, что нет.)
но нужно использовать [anArray release];
Я думал, что это заставит меня освободить память, которую я выделил ... (но я думаю, нет) ... и тогда мне придется перераспределить больше памяти. (Но я думаю, что нет.)
anArray = [[NSMutableArray arrayWithObjects: @ "один", @ "два", @ "три", ноль] сохранить];
Так что я должен "сохранить" это ... чтобы оно не исчезло из-под меня?
(Не уверен, почему это так. Пока я не скажу это ... в моем последнем вызове в dealloc.)
Другой, возможно, более правильный способ исправить это - использовать addObject: или
addObjectsFromArray: методы NSMutableArray вместо постоянного создания новых массивов.
Я только хочу создать массив ONE ... и использовать его так, как я хочу.
Я никогда не хочу ADD к массиву. Я хочу установить новые значения.