#macos #nsstring #nsmutablearray #deep-copy #shallow-copy
#macos #nsstring #nsmutablearray #глубокое копирование #мелкое копирование
Вопрос:
Я новичок в пространстве iPhone / Mac, и это, вероятно, довольно простой вопрос, я провел некоторый поиск и не нашел прямого ответа.
Я хотел бы знать, выполняет ли метод AddObject для массивов / изменяемых массивов неглубокий (только указатель) или глубокий (копирует объект) при добавлении.
- Изменяемый массив, который был выделен
- NSString, которая была выделена с помощью какой-либо инициализации
- Мы добавляем строку в изменяемый массив
- Затем мы выпускаем 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.
С уважением,
Кристиан