Я только что обнаружил следующее: Как я и ожидал, при освобождении моего объекта перед его возвратом происходит сбой приложения:
+ (NSString *)descriptionOfExpression:(NSArray *)anExpression {
NSMutableString *expressionDescription;
expressionDescription = [[NSMutableString alloc] init];
for (id object in anExpression) {
//Do stuff to expressionDescription
}
[expressionDescription release];
return expressionDescription;
}
Однако я не ожидал, что следующее вызовет утечку памяти:
+ (NSString *)descriptionOfExpression:(NSArray *)anExpression {
NSMutableString *expressionDescription;
expressionDescription = [[NSMutableString alloc] init];
for (id object in anExpression) {
//Do stuff to expressionDescription
}
return expressionDescription;
[expressionDescription release];
}
В конечном итоге мое решение заключалось в том, чтобы сделать это вместо:
+ (NSString *)descriptionOfExpression:(NSArray *)anExpression {
NSMutableString *expressionDescription;
expressionDescription = [[NSMutableString alloc] init];
for (id object in anExpression) {
//Do stuff to expressionDescription
}
[expressionDescription autorelease];
return expressionDescription;
}
Я понимаю, почему это работает с автоматическим выпуском, но как возникает утечка, вызванная освобождением после возврата значения?
Мой второй вопрос очень связан: всегда ли правильны системы обнаружения утечек памяти?
Я понимаю, что программисты, которые разработали Instruments и функцию сборки и анализа в XCode, гораздо более опытны в этом вопросе, чем я, поэтому сейчас я предполагаю, что они всегда правы.Однако мне трудно понять, как такая программа, как «Инструменты», может «узнать», что память просочилась.Я думаю, это должно полностью зависеть от того, как долго я, программист, хочу использовать объект.
Это мое понимание того, что такое «утечка»:
Определение человека: Память протекает, если у меня выделена память, когда я ее не использую.
Определение программирования с использованием счетчиков: при выделении памяти происходит утечка памяти, но нет активных объектов с счетом сохранения на рассматриваемом объекте.
Определение программирования с использованием специальных возможностей: из-за утечки памяти происходит выделение памяти, к которой я не могу получить доступ из того места, где я сейчас нахожусь в программе.