Давайте пройдем через это
Ключ: M = сообщение об отпускании / сохранении, C = сумма сообщений об отпускании / сохранении
// +----+---+
// | M | C |
// +----+---+
NSArray *array = [[NSArray alloc] initWithContentsOfFile:fp]; // | +1 | 1 |
details = array; // | 0 | 1 |
[array release]; // | -1 | 0 |
// +----+---+
В этот момент вы можете видеть, что вы собираетесь возвращать details
, счетчик которого равен 0, поэтому он уже был освобожден = крах.
Копия - неправильный термин, поскольку вам на самом деле не нужна копия, так как вы просто хотите, чтобы указатель details
указывал на действительный объект, поэтому следующее будет более правильным
- (NSArray *)systemDetails
{
NSString *filePath = [self tempPathAndFileName:[self systemDetailsFileName]];
NSArray *details = [[[NSArray alloc] initWithContentsOfFile:filePath] autorelease];
if (!details) {
NSLog(@"No File to Load");
CreateSystem *cls = [[CreateSystem alloc] init];
details = [cls loadData];
[cls release]; cls = nil;
[self saveDataFile:details toPath:filePath];
}
NSLog(@"details: %@",details);
return details;
}
Здесь я использую метод NSArray
initWithContentsOfFile:
... [возвращает] nil, если файл не может быть открыт или содержимое файла не может быть проанализировано в массив
Это сокращает некоторые из ошибок и делает метод более легким для чтения. Я также расширил имена переменных до значимых имен (личные предпочтения).
Я также переименовал метод, так как load
искусство излишне, так как по сути вы возвращаете подробности системы, тот факт, что они загружаются, на самом деле не имеет значения для вызывающего метода.
Также важно отметить, что другие ответы предполагают, что вы берете дополнительное сохранение / копирование и затем не забудьте опубликовать возвращенный результат позже. Это противоречит соглашению по какао, так как имя метода не содержит new / init / copy, поэтому вызывающие методы не должны в конечном итоге владеть результатом.