Основной вопрос о массивах объектов iPhone C и глубокой копии с указателем

#macos #nsstring #nsmutablearray #deep-copy #shallow-copy

#macos #nsstring #nsmutablearray #глубокое копирование #мелкое копирование

Вопрос:

Я новичок в пространстве iPhone / Mac, и это, вероятно, довольно простой вопрос, я провел некоторый поиск и не нашел прямого ответа.

Я хотел бы знать, выполняет ли метод AddObject для массивов / изменяемых массивов неглубокий (только указатель) или глубокий (копирует объект) при добавлении.

  1. Изменяемый массив, который был выделен
  2. NSString, которая была выделена с помощью какой-либо инициализации
  3. Мы добавляем строку в изменяемый массив
  4. Затем мы выпускаем NSString

Если это правильный способ сделать что-то, предполагается, что AddObject выполнит глубокую копию NSString. Просто подтверждаю, что это правильный способ управления памятью с помощью изменяемого массива…

Комментарии:

1. Копирование ссылки — это не поверхностная копия. Что copy и mutableCopy делают, так это мелкие копии. Ссылка — это просто ссылка. На объект может быть миллион ссылок или только одна, в любом случае это не оказывает никакого влияния на состояние объекта .

Ответ №1:

addObject: выполняется поверхностная копия. Чего вам не хватает, так это того, что NSMutableArray сохраняет объект, поэтому он не исчезает, но не требует глубокой копии. Это ключевой момент в управлении памятью Objective-C. Вам следует прочитать Руководство по программированию управления памятью. Управление памятью Cocoa не сложное и невероятно последовательное. У меня есть сокращенное резюме в трех волшебных словах.

Комментарии:

1. NSArray addObject: никогда ничего не копирует. Копия указателя не является копией ashallow.

2. Да, я просмотрел это, но примеры, подобные приведенным выше, не так понятны для добавления и удаления из коллекций и т.д. Итак, я также могу предположить, что при вызове remoteObjectAt происходит то же самое, количество сохранений также вычитается на единицу. ….. Из того, что я прочитал в документе, это то, что происходит, просто хочу убедиться. Это уникальный способ выполнения задач по сравнению с другими 3gls. Но интересно, я думаю. Apple просто необходимо реализовать управляемое управление памятью на платформах IOS……

3. removeObject: освобождает объект. Обычно вам не следует беспокоиться об управлении внутренней памятью других объектов. Ваша задача — сохранить то, что вы отслеживаете (обычно потому, что они находятся в ivar). И соблюдайте соглашения об именовании, чтобы вы знали, являетесь вы владельцем или нет. Я не уверен, что вы имеете в виду, когда сравниваете ObjC с «другими 3gls», поскольку между ними не так много согласованности. У COBOL, C, C и Java совершенно разные подходы к управлению памятью. Когда вы говорите «управляемое управление памятью», вы имеете в виду сборку мусора?

Ответ №2:

При добавлении объекта в массив количество сохраняемых объектов будет увеличено. Объект будет освобожден, когда количество его сохранений равно 0. Таким образом, при добавлении NSString к вашему массиву это не будет копией (вы можете изменить foo, и он также будет изменен в массиве), но это увеличит количество сохранений foo на 1.

 NSString *foo = [[NSString alloc] initWithString@"bar"]; // retain count  1
[anArray addObject:foo]; // NOT COPIED, but retain count of 'foo' increased by 1
[foo release]; // retain count of foo decreased by 1
  

Когда вы в какой-то момент освободите массив, он вызовет release для своих объектов. Таким образом, количество сохранений foo, наконец, станет равным 0, и foo будет выпущен.

 // some time later..
[anArray release]; // anArray released, foo retain count = 0.. foo gets released.
  

С уважением,
Кристиан