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 * .. 所以,我声明了NSString的fileName,fullPath和databasePath。 数据库已发布但fileName,fullpath不会释放。我不知道为什么会这样。
我知道NSArray是自动释放的。但是文件目录是自动释放的吗? (newWordbookName是nsstring类型)
我希望我查看有关iPhone内存管理的文档。
答案 0 :(得分:2)
按照惯例,方法返回保留对象时只有两种情况是构造函数,即 alloc , new 等,以及对象复制方法(在其名称中包含副本) 。
在所有其他情况下,除非在文档中另有明确说明,否则该对象应该是自动释放的。
这是完整的内存管理文档: Cocoa Memory Management
答案 1 :(得分:2)
您不应该在上述代码中的任何对象上调用release
。
NSArray
为autorelease
'd的原因与所有其他对象autorelease
'的原因相同:为其分配名为autorelease
的值的方法他们回来之前。通常,如果对象中没有单词“create”或“new”,则可以假设方法返回autorelease
d个对象。这是一般的Cocoa惯例。 (虽然第三方代码可能很傻,而且做事情也不同,所以需要警告程序员。)
您只需要自己担心alloc
或copy
对象;换句话说,将每个alloc
或copy
与release
或autorelease
配对。