2016-04-08 5 views
1

Я прочитал несколько вопросов, но я все еще смущен. Я прочитал это: Objective-C ARC: strong vs retain and weak vs assign и некоторые другие вопросыМы увеличиваем счетчик ссылок здесь?

Когда мы говорим: someObject.color = customColor

ли мы увеличивая количество ссылок customColor по retain ИНГАМ его или мы создаем новый объект по copy ИНГАМ его? Или нет?

ответ

3

Эта инструкция присваивает свойству, то есть вызывает метод setter в классе someObject. Таким образом, это будет зависеть от способа реализации метода. Если это метод автогенерируемого сеттера, основанный на свойстве, то: если это свойство copy, метод -copy будет вызываться на customColor; если strong, то он будет сохранен (т. е. увеличит счетчик ссылок), или если weak или assign, то он не будет увеличивать количество ссылок.

Помните, что на некоторых неизменяемых классах метод -copy реализуется, чтобы просто вернуть self, так что это будет как удержание - это не всегда другая ссылка на объект.

+0

Спасибо, так что если это свойство копии, это не увеличит количество ссылок customColor, но это приведет к увеличению количества ссылок вновь скопированному объект? – Honey

+1

Вы можете легко проверить это, посмотрев адрес объекта. С неизменяемыми объектами, которые на самом деле представляют собой детали реализации, которые вам не нужны, потому что они могут работать в любом случае или меняться сейчас или позже. В вашем контракте просто говорится: «Дай мне что-то, что ведет себя как копия». – Eiko

+1

@ asma22 - это зависит от того, как метод -copy реализован на приемнике. Для неизменяемого объекта, такого как NSNumber, он фактически просто увеличит количество удержаний. Но для чего-то вроде NSMutableArray, тогда да, будет создан и сохранен новый (неизменный) экземпляр NSArray. Я считаю, что UIColor является одним из тех непреложных классов, поэтому в этом конкретном случае он просто увеличит количество удержаний. Концептуально это еще один объект, но неизменяемые классы могут оптимизировать эту операцию, так как нет возможности изменить экземпляр. –

1

Как official documentation состояний:

Есть три вида могущих быть удержанными типов указателей объекта:

  • блока указатели (образованный путем применения вставки (^) описатель сигила к типу функции)
  • Объектные указатели Objective-C (id, Class, NSFoo * и т. Д.)
  • typedefs, отмеченные знаком ((NSObj ЭСТ))

Когда мы имеем дело с указателями объектов Objective-C (узоров битов, указывающих местоположение заостренный-объекта) и код выглядит так:

UIColor *color1 = [UIColor whiteColor]; 

    // Increase reference count of color1 by 1, without copying it. 
    UIColor *color2 = color1; 

во время назначения объекты не копируются, но их ссылки (с увеличением количества ссылок).

Что касается вашего случая, как указано в другом комментарии, это зависит от атрибутов свойства: атрибут copy создает новый экземпляр объекта и увеличивает его количество ссылок, оставляя исходный объект незатронутым.

Кстати, вы можете проверить количество ссылок на свои объекты с помощью инструмента «Выделения». Проверьте, например, этот приятный answer, чтобы узнать, как вы можете управлять им.

0

Я нашел это изображение от Apple, собственного documentation, просто если свойство цвета сильного указателя, то это приведет к увеличению удержания счета, и если это указатель копии, то это создаст новый объект с сохранить кол-1

memory_management

Смежные вопросы