Я некоторое время разрабатывал приложение, и теперь я попал в раздел "Инструменты-утечки".
Я помню одну вещь, которая озадачивала меня в отношении иваров несколько месяцев назад, когда я учился. Я немного поверил в это и просто следовал тому, как это делали Apple и другие. Насколько я могу прочитать, средства доступа, созданные SDK, позаботятся об управлении памятью.
Но как сами ивары инициализируются?
Если у меня есть такой ивар в моем интерфейсе;
@interface
{
NSArray *results;
}
@property(nonatomic, retain) NSArray *results;
@end
@implementation
@synthesize results;
Если я во время выполнения попытаюсь сделать это:
[self setResults:allReadyInitializedArray];
Это приведет к сбою, сообщая, что этот объект результата не был инициализирован. Однако если я сделаю это:
self.results = [[NSArray alloc] init]; //Im assigning this property memory, but hasn't the SDK already done that?
[self setResults:allReadyInitializedArray];
это будет работать, но, видимо, утечка памяти.
У меня сложилось впечатление, что с помощью сгенерированного
аксессоры освободят старое значение перед установкой нового, то есть
вышесказанное должно выходить со старым выпущенным значением, а новое со счетом удержания +1.
Имеет ли это какое-то отношение к ивару, имеющему тип NSArray / NSMutableArray, я не могу вспомнить, что это была проблема с другими иварами.
Проблема была особенно заметна в моем анализаторе XML, где мне постоянно нужно устанавливать значение ivar, использовать его, перезаписывать это значение, использовать новое значение и т. Д.
Кто-нибудь, пожалуйста, помогите мне обрисовать в общих чертах правильный путь "перехода от": @property () -> @synthesize -> использование ivar -> для освобождения?
Я прочитал документы по управлению памятью, я пытался найти некоторые документы по долгу, которые были в моем понимании, но, похоже, что хотя я и использую ивар ежедневно, я не понимаю, что происходит за кулисами. .