Предотвращение утечек при использовании @property и @synthesize - PullRequest
0 голосов
/ 28 августа 2011

Какие шаги мы должны предпринять - каковы лучшие методы - чтобы предотвратить утечки при использовании @property и @synthesize?

Ответы [ 2 ]

3 голосов
/ 28 августа 2011

Знайте о своих стандартных вещах, которые возвращают вам сохраненные объекты, методы с помощью alloc, copy или new. Когда вы вызываете их вместе со своей собственностью, вы можете непреднамеренно создать утечку.

В вашем интерфейсе у вас есть

@property (nonatomic, retain) NSArray *someArray;

А в вашей реализации у вас есть

@synthesize someArray;

Затем вы используете свойство

self.someArray = [[NSArray alloc] init];

у вашего объекта теперь есть счетчик сохранения 2. один от использования self.someArray = и один от alloc. self.someArray = вызывает ваш установщик, который совпадает с - (void) setSomeArray: (NSArray) someArray; который создан для вас с синтезом. Это будет содержать retain из-за ключевого слова retain, которое вы использовали в объявлении @property.

Я склонен избегать этого одним из двух способов.

либо с использованием автоматически выпущенного инициализатора

self.someArray = [NSArray array];

или

self.someArray = [[[NSArray alloc] init] autorelease];

или использовать временную переменную

NSArray tempArray = [[NSArray alloc] init];
self.someArray = tempArray;
[tempArray release];

все эти методы оставят вас с вашим объектом self.someArray, имеющим количество сохраняемых единиц, которое вы можете позаботиться в dealloc.

- (void)dealloc {
[someArray release];
[super dealloc];
}
0 голосов
/ 28 августа 2011

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

Для различных назначений свойств в течение времени жизни объекта об этом должны заботиться автоматические синтезаторы.

...