2015-12-25 2 views
-1

Я не часто использую свойство atom, но я нашел что-то странное. В моем тестовом файле не используется ARC.
Я использую свойство @property(atomic,retain) NSArray* test; Затем я просто делаю тест на предмет в методе init. как этотатомный make saveCount + 1

1) NSArray* testArray = [NSArray arrayWithObject:@"1"]; 
2) self.test = testArray; 

После выполнения 1)

[testArray retainCount] = 1 

После выполнения 2)

[testArray retianCount] = 2 
[self.test retainCount] = 3 
[_test retainCount] = 3. 

Тогда я изменить свойство атомное к неатомической. После выполнения 1)

[testArray retainCount] = 1 

После выполнения 2)

[testArray retianCount] = 2 
[self.test retainCount] = 2 
[_test retainCount] = 2. 

, так что я не знаю, почему. атомный может добавить keepCount?

+2

Короткий ответ: 'keepCount' является внутренней деталью реализации и не должен использоваться ни для чего. – Avi

+0

Странно, что '[testArray saveCount]' и '[self.test saveCount]' могут быть разными. – kelin

+0

@kelin Не совсем; абсолютное значение сохранения объекта совершенно бесполезно. Разница - это деталь реализации компилятора и/или среды выполнения. Вероятно, он изменится между уровнями оптимизации, платформами и/или версиями программного обеспечения. – bbum

ответ

0

Вы не должны выполнять руководство вручную. Подсчет в этот день и возраст. Серьезно, нет никакого недостатка в использовании ARC. Единственная причина, по которой я могу думать, это, если вам нужно сохранить устаревший код, который нельзя преобразовать в ARC (из-за приоритетов распределения ресурсов и т. Д.).

Даже в те дни MRC, Apple сильно обескуражил прямое манипулирование retainCount собственности: это всего лишь деталь реализации, опираясь на это будет просто сделать ваше приложение хрупким.

Вы должны создать свое приложение вокруг графиков объектов (отношений собственности), будь то с ARC или MRC.

+0

Я не согласен с тобой. В то время как MRC устарел, полезно отслеживать 'keepCount' во время профилирования, чтобы понять, что происходит с объектом. – kelin

+0

Как я уже сказал, «(дизайн вашего приложения), полагаясь на него, просто сделает ваше приложение хрупким». Я никогда не говорил, что это не может быть полезным инструментом отладки. –

+0

@kelin Не подходит для отладки. У вас нет способа узнать, сохраняется ли какое-либо из сохраненных элементов из-за пула авторасчетов, внутренней детализации реализации фреймворков, поскольку он фиксируется в блоке и/или из-за некоторых синонимов параллелизма. – bbum

0

Я думаю, атом положить объект в текущий опрос Autorelease. Необходимо сделать объект живым во время работы с ним (в этот момент объект может быть выпущен на другой поток).
Попробуйте обернуть

NSArray* testArray = [NSArray arrayWithObject:@"1"]; 
self.test = testArray; 

с AutoreleasePool и проверить retainCount после (Тогда код выхода из autorelease опроса).
Я думаю, что вы получите keepCount == 1.

0

Абсолютное значение saveCount абсолютно бесполезно. Вы не можете вывести из него смысл об объекте жизни и не особенно полезны для отладки.

Для получения дополнительной информации см. http://www.whentouseretaincount.com.

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

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