сохранить поведение при использовании (сохранить) свойство - PullRequest
0 голосов
/ 22 февраля 2012

Привет, ребята. У меня вопрос по поводу следующей проблемы.

У меня есть два объекта: aClass и bClass. aClass должен содержать bClass с использованием свойства retain. После создания экземпляра bClass (здесь я не использую удобного распределителя, потому что я хочу решить мою проблему недопонимания здесь), bClass присваивается aClass с помощью setProperty aClass.

На протяжении всего процесса я проверяю retainCount bClass, запрашивая ссылку, а также задавая свойство through класса aClass.

Насколько я понял, управление памятью в Objective C, упомянутые значения сохранения должны быть одинаковыми, потому что я делю владение объектом между свойством и ссылкой.

Мне кажется, у меня есть большая проблема в понимании управления памятью. Может быть, кто-то может объяснить мне мою ошибку. Спасибо заранее.

Header of ClassA

@property (retain )ClassB *myProperty; 


Source of ClassA

@implementation ClassA
-(id)init {

self = [super init];

if (self) {
    ClassB * bClass = [[ClassB alloc] init];
    NSLog(@"Temporary bClass retain count = %d", [bClass retainCount]);

    self.myProperty = bClass;
    NSLog(@"retain count after giving ownership to ClassA = %d", [bClass retainCount]);

    [bClass release];
    NSLog(@"retain count of bClass after release = %d", [bClass retainCount]);
    NSLog(@"retain count of myProperty of ClassA = %d", [self.myProperty retainCount]);
}
return self;
}

Вывод:

Временный счет удержания bClass = 1

сохранить счет после передачи права собственности на ClassA = 2

сохранить количество bClass после выпуска = 1

сохранить количество MyProperty ClassA = 2

Ответы [ 3 ]

2 голосов
/ 23 февраля 2012

Экземпляры объекта сохраняются и освобождаются.Указатели на экземпляры объектов не являются объектами, и они сами не сохраняются и не освобождаются.

Сначала у вас есть указатель bClass, указывающий на экземпляр BCLass.Этот экземпляр сохраняется при вызове init.(Сохранить счетчик = +1)

Затем вы назначаете другой указатель через установщик свойств setMyProperty.Поскольку свойство объединено с атрибутом retsain, экземпляр BClass снова сохраняется.(Сохранить счет = +2)

Затем вы вызываете release для экземпляра BClass, на который указывает bClass.(Это тот же экземпляр BClass, на который указывает свойство myProperty. (Сохранить количество = +1 сейчас.)

Эффект не использования неатомического атрибута можно увидеть из документации:

Свойства являются атомарными по умолчанию, так что синтезированные средства доступа обеспечивают надежный доступ к свойствам в многопоточной среде, то есть значение, возвращаемое из метода получения или устанавливаемое через установщик, всегда полностью извлекается или устанавливается независимо от того, какие другие потокивыполняются одновременно.

Если вы указываете strong, копируете или сохраняете и не указываете неатомарное, то в среде с подсчетом ссылок синтезированный метод доступа get для свойства объекта использует блокировку и сохраняет и автоматически выпускает возвращенныйзначение - реализация будет похожа на следующее:

[_internal lock]; // lock using an object-level lock

id result = [[value retain] autorelease];

[_internal unlock];

return result;

Таким образом, похоже, что вы записываете в журнал оператор, ссылающийся на свойство, которое сохраняет объект (Retain = +2) и помещает его в авторелиз.бассейн. (Релиз случится латer.

Собственность - это просто взять на себя ответственность за то, чтобы сообщить объекту, что он больше не нужен этому владельцу, когда придет время его отпускать.Принятие права собственности осуществляется путем сохранения экземпляра объекта (с New, Init, Retain или Copy).

2 голосов
/ 22 февраля 2012

retainCount бесполезно.Не вызывайте его.

В частности, он никогда не может отразить, был ли объект автоматически освобожден, и atomic @property сохранит / автоматически освободит объект при вызове метода получателя.

1 голос
/ 23 февраля 2012

Все, что вам нужно запомнить, это то, что если вы распределяете, копируете или обновляете его, то вы вступаете во владение объектом и вам нужно его освободить.Я не буду беспокоиться о значении retainCount.

...