2012-02-22 3 views
-1

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

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

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

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

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

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 of ClassA = 2

+0

Не используйте '-retainCount'. Это не полезно. Http://stackoverflow.com/questions/4636146/when-to-use-retaincount – newacct

ответ

2

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

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

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

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

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

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

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

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

id result = [[value retain] autorelease]; 

[_internal unlock]; 

return result; 

Так это выглядит, как вы попрежнему заявление ссылается на свойство, которое сохраняет объект (Сохранил = +2) и помещает его в autorelease бассейн. (Освобождение произойдет позже.

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

+0

Большое спасибо, это очень помогло! – user1214249

+0

«Этот экземпляр сохраняется при вызове init». Этот экземпляр фактически сохраняется при вызове 'alloc'. 'init' не концептуально изменяет счет сохранения – newacct

2

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

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

+0

не является собственностью используя (удерживать) авторекламу объекта в случае вызова соответствующего геттера? Я думал, что это не имеет ничего общего с атомом Можно ли предположить, что мое использование свойства было правильным? Несмотря на то, что я использовал saveCount. – user1214249

+0

Это реализация deta ил; атомные свойства сохранят/autorelease на get, а не атомные не будут. И, да, использование bClass в этом примере не будет протекать. – bbum

+0

@ user1214249: свойство getter/setter может сохраняться и автоматически регистрироваться 5 раз, если ему это нравится. Вы не можете зависеть от этого. Добавление сохранения/авторекламы никогда не уменьшает правильность кода. Таким образом, любая функция может свободно использовать ее столько, сколько она хочет, из изобилия предостережения. – newacct

1

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

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