iOS: использование self вызывает утечку памяти? - PullRequest
2 голосов
/ 03 августа 2011

Используя анализатор в XCode 4, я получаю предупреждения о возможных утечках памяти из-за установки свойства, подобного этому:

self.newDog.dogName = self.dogNameTextField.text;

Специальное предупреждение:

  1. Свойство возвращает объект Objective C с счетом сохранения +1 (ссылка на владельца).

  2. Объект, размещенный в строке 513, не упоминается позднее в этом пути выполнения и имеет счет сохранения +1 (объект утек)

Если я не установил свойство с помощью self, предупреждение исчезнет ... но я не уверен, не вызовет ли это других проблем, так как все, что я прочитал, в основном говорит, что всегда использовать self при установке / Получение недвижимости:

newDog.dogName = self.dogNameTextField.text;

Я что-то здесь не так делаю? Вот некоторый урезанный код из контроллера представления, где появляются предупреждения:

@interface AddDogViewController : UITableViewController {
    Dog *newDog;
}

@property (nonatomic, retain) Dog *newDog;




@implementation AddDogViewController

@synthesize newDog;

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    // some other code

    self.newDog.dogName = self.dogNameTextField.text;

    // some other code
}


- (void)dealloc {
    [newDog release];
    [super dealloc];
}

@end

Ответы [ 2 ]

8 голосов
/ 03 августа 2011

В соответствии с правилами управления памятью, метод, который начинается с new, возвращает счет удержания +1 (как и alloc и copy). Ваш аксессор newDog имеет такое имя.

Вам следует переименовать вашу собственность в нечто, что не начинается с new. Обратите внимание, что вы на самом деле ничего не пропускаете здесь. Вы просто путаете анализатор, потому что нарушаете правила именования.

2 голосов
/ 03 августа 2011

Это потому, что при доступе к ivar, выполняющему self.myIvar, вы используете для этого метод setter, который был synthesized, и поэтому, если он был объявлен как retain, он отправит егодополнительно retain msg.

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

...