Как выпустить NSString - PullRequest
       15

Как выпустить NSString

1 голос
/ 03 апреля 2010
NSArray     *path                   = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString    *documentsDirectory     = [path objectAtIndex:0];

NSString    *databasePath           = [documentsDirectory stringByAppendingPathComponent:@"DB"];
NSString    *fileName               = [newWordbookName stringByAppendingString:@".csv"];
NSString    *fullPath               = [databasePath stringByAppendingPathComponent:fileName];

[[NSFileManager defaultManager] createFileAtPath:fullPath contents:nil attributes:nil]; 

[databasePath release];
//[fileName release]; Error!
//[fullPath release]; Error!

//NSLog(@"#1 :databasePath: %d",[databasePath retainCount]);
//NSLog(@"#1 :fileName: %d",[fileName retainCount]);
//NSLog(@"#1 :fullPath: %d",[fullPath retainCount]);

Я использую этот код и хочу выпустить NSString * .. Итак, я объявляю fileName, fullPath и databasePath NSString. база данных освобождена, но fileName, полный путь не освобождается. Я не знаю, почему это происходит.

Я знаю, что NSArray автоматически выпущен. Но является ли DocumentsDirectory автоматически выпущенным? (newWordbookName - тип nsstring)

Я надеюсь, что я просматриваю документ об управлении памятью iPhone.

Ответы [ 2 ]

2 голосов
/ 03 апреля 2010

Вы не должны вызывать release ни на одном из объектов в приведенном выше коде.

Причина, по которой NSArray равен autorelease 'd, является той же самой причиной, по которой все другие объекты autorelease' d: методы, которые присваивают им свои значения, называются для них autorelease до того, как они возвращаются. В общем, вы можете предположить, что методы возвращают autorelease 'd объектов, если в них нет слова «создать» или «новый». Это общая конвенция о какао. (Хотя сторонний код может быть глупым и делать что-то по-другому, так что будьте осторожны, программист).

Вам действительно нужно беспокоиться только об объектах, которые вы alloc или copy сами; другими словами, соедините каждый alloc или copy с release или autorelease.

2 голосов
/ 03 апреля 2010

По соглашению только два случая, когда метод возвращает сохраненный объект, - это конструкторы, т. Е. alloc , new и т. Д., И методы копирования объектов (содержащие в своем имени копию).

Во всех других случаях ожидается, что объект будет автоматически освобожден, если в документации явно не указано иное.

Это полная документация по управлению памятью: Управление памятью какао

...