iPhone: вопросы управления памятью для новичков - PullRequest
4 голосов
/ 08 апреля 2011

Я новичок в разработке для iPhone, и я много читал, прежде чем перейти к своему первому приложению.Все эти чтения заставили меня понять, что правильное управление памятью - большая проблема, поэтому я хочу все делать правильно.

Я только что закончил свое первое приложение и начал тестировать его на утечки.Их было много :) Я изменил код для устранения утечек, а затем начал получать исключения BAD_ACCESS.Теперь мои вопросы:

  • У меня есть объект UITextView, давайте назовем его utv.Я видел, что его текстовое поле определяется следующим образом:

    @ property (nonatomic, copy) NSString * text;

Если я напишу следующую строку кода:

utv.text = [NSString stringWithString:@"Blabla"];

Меня не должно беспокоить то, что пул авто-выпусков освобождает строку, верно?Потому что он использует копию?

  • Что, если он был определен как

    @ property (nonatomic, retain) NSString * text;

    Должен ли я все еще не делатьбеспокоиться о пуле автоматического выпуска, так как сохранение увеличило число ссылок на 1?

  • Могу ли я узнать, когда пул автоматического выпуска освободит строку, созданную мной, с stringWithString вместо initWithString?

Спасибо!Eli

Ответы [ 5 ]

3 голосов
/ 08 апреля 2011

Вы, по-моему, в значительной степени ответили на свой вопрос. Если свойство было retain единица, новое значение будет отправлено сообщение retain в его методе синтезированного сеттера, поэтому вы не должны беспокоиться об этом:)

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

// assign 
property = newValue;

// retain
if (property != newValue) {
    [property release]; 
    property = [newValue retain];
}

// copy 
if (property != newValue) {
    [property release]; 
    property = [newValue copy];
}
1 голос
/ 08 апреля 2011

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

Обе эти строки создают сохраненные свойства:

@property (nonatomic, copy) NSString *text;
@property (nonatomic, retain) NSString *otherText;

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

self.text = string1; // this retains a copy of string1
self.text = string2 // this releases the copy of string1 and retains the copy of string2
self.text = nil; // this releases the copy of string2

У вас есть self.text и self.otherText, поэтому вам нужно освободить их в dealloc.

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

0 голосов
/ 09 апреля 2011

Это - хорошее чтение для управления памятью
Надеюсь, это кому-нибудь поможет.!

0 голосов
/ 08 апреля 2011

Все, что вы удерживаете, нужно отпустить Вы не можете зависеть от того, когда autorelease выпустит то, что в пуле.

Этот вопрос задавался ранее. Вот простой ответ

http://cocoadevcentral.com/d/learn_objectivec/

0 голосов
/ 08 апреля 2011

Вы правы.Вы не должны беспокоиться о пуле автоматического выпуска, когда свойство установлено как сохранение или копирование.Вы не будете знать, когда NSAutoreleasePool освободит вашу строку, но вы можете предположить, что вы можете использовать ее в том же методе, который объявлен свободно.Предполагается, что каждый поток имеет свой собственный NSAutoReleasePool, который может быть удален в любое время, но обычно сливается в начале каждого цикла выполнения.

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