Управление памятью iPhone - PullRequest
       4

Управление памятью iPhone

1 голос
/ 09 сентября 2010

Здравствуйте, члены семьи Stackoverflow!

У меня есть вопрос, касающийся управления памятью в iPhone.

Что я понял, был метод ниже

-(void) dealloc
{
    // something else to release whatever
    // such as Object Created using keyword 'alloc'
    // but also Object destroy here its retain value reaches iff 0
    // if I do put here NSLog(@"%d", [obj retainCount]); and when it reaches
    // not equal to 0 means failure with memory leak.
    [super dealloc];
}

Я правильно понимаю?или Это все еще хорошо, даже если счет сохранения достигает> 0 здесь?

Причина, по которой я спрашиваю об этом вопросе, потому что,

Я проверил с помощью

NSLog(@"%d", obj.retainCount);

, чтобы проверитьсохранить счетчик объекта и полученного значения 3. Поэтому я попытался освободить здесь 3 раза, чтобы сделать retainCount здесь равным 0, но компилятор выдает мне критическую ошибку.

Пожалуйста, я новичок в памяти.выделение и сохранение, освобождение.

Объект, который я использовал, был объектом 'UIImageView' и создал другой экземпляр как

UIImageView *imageView = //da da~ with UIImage
UIImageView *instance;
// at this point retain count was '1'
instance = imageView;
//[imageView retain];
// at this point retain count was '2'
[self.view addSubView: imageView];
// at this point retain count was '3'
[imageView release];// crashes
// at this point retain count was '2'

, но если я сделаю

// but if I add retain on the 'instance = imageView'
// such as
instance = imageView; // then
[imageView retain];
// works but still count is 2...

СпасибоВы.

Ответы [ 3 ]

5 голосов
/ 09 сентября 2010

retainCount не является надежным инструментом отладки:

  • другие объекты могут по-прежнему содержать ссылки на obj
  • есть объекты, которые вы не можете уничтожить (например, строковые константы )
  • объекты освобождаются, если освобождены с счетом сохранения 1

О чем следует позаботиться:

  • балансировочных ссылок у вас есть с нужным количеством release / autorelease
  • с использованием Анализатор
  • с использованием Утечки
1 голос
/ 09 сентября 2010

Обычный процесс переопределения dealloc состоит в освобождении любых объектов, которые ранее были сохранены (или размещены) этим экземпляром.

Так что если где-то еще в объекте вы вызвали метод alloc или retain, ваш dealloc будет выглядеть так:

-(void)someOtherMethod
{
    UIImageView *imageView = //da da~ with UIImage
    UIImageView *instance;
    instance = imageView;
    [instance retain];
}

-(void) dealloc
{
    //release any retained objects here
    [instance release]        
    [super dealloc];
}

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

Надеюсь, это поможет.

0 голосов
/ 09 сентября 2010

Это не правильно, и вы редко должны использовать retainCount.Это не должно быть 0 в этой точке, поскольку другие объекты могут иметь ссылки на объекты, которые вы освобождаете.Что важно сделать в dealloc - это освободить объекты, которыми вы владеете.Которые будут объектами, созданными с помощью alloc или new и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...