Корректный способ объявить, выделение, загрузка и dealloc NSMutableArray

Я объявляю свой массив в моем *.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 () и количество" разрушил бы все.


Кортик,

Позвольте мне поместить его этот путь: у Меня есть ОГРОМНОЕ неверное толкование указателей, массивов, строк и памяти.

Я считал все, что я могу найти на нем..., но (все же) найти простое, четкое, легкое для понимания описание.

Можно ли предложить тот? (Надо надеяться, меньше чем 10 страниц чтения.) Там ссылка, которая объясняет ПРОСТО, что эта тема... и с точки зрения "Вас имеет 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:@ "один", "два", "три", ноль]; Вместо этого Вы заменяете его новым экземпляром, и хуже: с экземпляром, ссылка которого на самом деле принадлежит некоторому объекту, которым Вы не управляете

Ничего себе. Таким образом, у меня могло быть 20 массивов... все названные тем же именем: anArray... и они все отличались бы? (Нет такой вещи как ГЛОБАЛЬНЫЙ массив?)

и т.д. Для убирания старых значений метод removeAllObject может быть удобным. Существуют также методы мутации, которые могут использоваться для добавления нескольких значений сразу.

Так... сначала я должен "удалить все объекты"..., и затем я могу назвать ОДИН метод, он повторно добавляет все мои новые значения.

anArray = [[NSMutableArray arrayWithObjects:@ "один", "два", "три", ноль] сохраняют]; вместо последовательности alloc/init.

Ничего себе. Я думал, что ничто не могло быть сохранено в массиве без пространства alloc'ing для него.

Если Вы действительно намереваетесь заменить целый массив, можно хотеть рассмотреть использование свойств

Как я сделал бы то использование свойства?
Что было бы корректным способом сделать что-то вроде этого:

> anArray = [NSMutableArray arrayWithObjects:@"one", @"two", @"three", nil];
> anArray = [NSMutableArray arrayWithObjects:@"four", @"five", @"six", nil];

Точно так же, как я сделал бы:

x = 12;
x = 24;

Ничего себе. Я ДЕЙСТВИТЕЛЬНО имею, полностью неправильно понимают все о строках, массивах и памяти. Я думал, что "простой способ" был к выделению, ПОСЛЕ ТОГО КАК... используют изменяемый массив... изменяют его так, как Вы хотите... и освобождаете его ОДНАЖДЫ.

Проблема с выполнением так состоит в том, что этот новый массив не сохраняется,

Я думал бы, что старый массив закончится..., и новый массив мог использоваться. (Но я предполагаю нет.)

Далее, у Вас есть утечка памяти, потому что Вы никогда не освобождали исходный массив.

Я думал, что старый массив не был, предполагают, чтобы быть освобожденным... Я не сделан с ним... Я просто хочу ИЗМЕНИТЬ его для содержания моих новых значений. (Но я предполагаю нет.)

но нужно использовать [anArray выпуск];

Я думал, что это заставит меня освобождать память, которую я выделил... (но я предполагаю не)..., и затем у меня было бы к перевыделению больше памяти. (Но я предполагаю нет.)

anArray = [[NSMutableArray arrayWithObjects:@ "один", "два", "три", ноль] сохраняют];

Таким образом, я должен "сохранить" его..., таким образом, это не исчезает из-под меня? (Не уверенный, почему это было бы. Пока я не говорю это... в моем финале dealloc вызов.)

Другой, вероятно, более корректный способ зафиксировать его состоял бы в том, чтобы использовать addObject: или addObjectsFromArray: методы NSMutableArray вместо того, чтобы постоянно создать новые массивы.

Я только хочу создать ОДИН массив... и просто использовать его, как я хочу. Я никогда не хочу к ADD к массиву. Я хочу установить его на свои новые значения.

6
задан Robert Harvey 13 September 2011 в 04:52
поделиться

2 ответа

Вы не загружаете свой массив с помощью

anArray = [NSMutableArray arrayWithObjects:@"one", @"two", @"three", nil];

Вместо этого вы заменяете его новым экземпляром, и того хуже: экземпляром, ссылка на который на самом деле принадлежит какой-то организации, которую вы не контролируете (скорее всего, NSAutoreleasePool .) Ссылка, которой вы надлежащим образом владеете, созданная

[[NSMutableArray alloc] init]

, потеряна и будет утрачена.

Вместо замены всей ссылки на массив измените уже имеющуюся в вашем распоряжении, используя, например, addObject: like

[anArray addObject: @"one"]
[anArray addObject: @"two"]

и т. Д. Чтобы удалить старые значения, может оказаться полезным метод removeAllObject . Существуют также методы мутации, которые можно использовать для одновременного добавления нескольких значений.

В качестве альтернативы вы можете выделить массив, используя метод построения, который вы уже используете, но будьте осторожны, чтобы сохранить его.В viewDidLoad do

anArray = [[NSMutableArray arrayWithObjects:@"one", @"two", @"three", nil] retain];

вместо последовательности alloc / init .

Если вы действительно собираетесь заменить весь массив, вы можете рассмотреть возможность использования свойств вместо ручного подсчета ссылок.

11
ответ дан 8 December 2019 в 12:59
поделиться

Проблема anArray = [NSMutableArray arrayWithObjects: @ "one", @ "two", @ "three", nil]; Это заменяет изначально созданный массив. Проблема заключается в том, что этот новый массив не сохраняется, поэтому вы потеряете его, как только метод вернется. Кроме того, у вас есть утечка памяти, потому что вы никогда не освобождали исходный массив.

Есть несколько способов исправить это, но один из них - использовать [выпуск anArray]; anArray = [[NSMutableArray arrayWithObjects: @ "one", @ "two", @ "three", nil] сохранить]; вместо этого.

Другой, вероятно, более правильный способ исправить это - использовать методы addObject: или addObjectsFromArray: NSMutableArray вместо постоянного создания новых массивов.

4
ответ дан 8 December 2019 в 12:59
поделиться