Мне нужно глубоко скопировать настраиваемый объект, у которого есть собственные объекты. Я читал и немного смущен тем, как наследовать NSCopying и как использовать NSCopyObject.
objective-c
copy
Бен
источник
источник
Ответы:
Как всегда со ссылочными типами, есть два понятия «копия». Я уверен, что вы их знаете, но для полноты картины.
Вы хотите последнего. Если это один из ваших собственных объектов, вам нужно просто принять протокол NSCopying и реализовать зону (id) copyWithZone: (NSZone *). Вы можете делать все, что хотите; хотя идея состоит в том, чтобы сделать настоящую копию себя и вернуть ее. Вы вызываете copyWithZone во всех своих полях, чтобы сделать глубокую копию. Простой пример:
источник
autorelease
не должен, или я что-то здесь упускаю?copyWithZone:
соответствует этим критериям, поэтому он должен возвращать объект со счетчиком удержания +1.alloc
вместо,allocWithZone:
так как зона была передана?allocWithZone
.copy
,mutableCopy
иcopyWithZone
, связанной с одним из ответов, здесь.В документации Apple говорится
добавить к существующему ответу
источник
No visible @interface for 'NSObject' declares the selector 'copyWithZone:'
. Я предполагаю, что это требуется только тогда, когда мы наследуем от какого-то другого настраиваемого класса, который реализуетcopyWithZone
Я не знаю разницы между этим кодом и моим, но у меня есть проблемы с этим решением, поэтому я прочитал немного больше и обнаружил, что мы должны установить объект, прежде чем возвращать его. Я имею в виду что-то вроде:
Я добавил этот ответ, потому что у меня много проблем с этой проблемой, и я понятия не имею, почему это происходит. Я не знаю разницы, но у меня это работает и, возможно, может быть полезно и для других :)
источник
Я думаю, что эта строка вызывает утечку памяти, потому что вы
obj
получаете доступ к свойству through, которое (я полагаю) объявлено какretain
. Таким образом, счетчик удержания будет увеличиваться за счет собственности иcopyWithZone
.Я считаю, что это должно быть:
или:
источник
Также для копирования используется оператор ->. Например:
Причина здесь в том, что полученный скопированный объект должен отражать состояние исходного объекта. Знак "." Оператор может вызвать побочные эффекты, поскольку он вызывает геттеры, которые, в свою очередь, могут содержать логику.
источник