我对iPhone的Objective C很新,所以我希望你不要因为问一个简单的问题而杀了我。
我已经制作了一个可以正常工作的应用程序,除了仪器报告下面的类中的内存泄漏。我用它来存储一个类的设置,然后从另一个类中检索它们。这些设置存储在一个文件中,因此每次运行App时都可以检索它们。
我该怎么办才能发布“设置”,是否可以采取更智能的方式调用(使用)课程?
由于
----- Below is Settings.m -----
#import "Settings.h"
@implementation Settings
@synthesize settings;
-(NSString *)dataFilePath // Return path for settingfile, including filename
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
return [documentsDirectory stringByAppendingPathComponent:kUserSettingsFileName];
}
-(NSMutableArray *)getParameters // Return settings from disk after checking if file exist (if not create with default values)
{
NSString *filePath = [self dataFilePath];
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) // Getting data from file
{
settings = [[NSMutableArray alloc] initWithContentsOfFile:filePath];
}
else // Creating default settings
{
settings = [[NSMutableArray alloc] initWithObjects:
[NSNumber numberWithInteger:50],
[NSNumber numberWithInteger:50],
nil];
[settings writeToFile:[self dataFilePath] atomically:YES];
}
return settings;
}
----- Below is my other class from where I call my Settings class -----
// Get settings from file
Settings *aSetting = [[Settings alloc] init];
mySettings = [aSetting getParameters];
[aSetting release];
答案 0 :(得分:1)
在-getParameters
方法中,您分配/初始化一个永不释放的NSMutableArray([[NSMutableArray alloc] initWithContentsOfFile:filePath]
- 即保留计数为1)。您应该在返回之前自动释放数组:return [settings autorelease]
。
请注意,如果您需要将设置参数放在mySettings
变量中并希望保留它,则应执行mySettings = [[aSetting getParameters] retain];
以使保留计数不会降至0。
答案 1 :(得分:1)
或者,更好的是:
settings
属性声明为retain
属性,然后self.settings
方法中使用settings
代替-getParameters
,最后autorelease
。答案 2 :(得分:0)
通过修改两行来管理解决Settings类:
1:使用 settings = [NSMutableArray arrayWithContentsOfFile:filePath] 代替 settings = [[NSMutableArray alloc] initWithContentsOfFile:filePath]
2:以类似的方式使用 settings = [NSMutableArray arrayWithObjects: 代替 settings = [[NSMutableArray alloc] initWithObjects
现在我只需要解决从另一个类创建这些漏洞时的漏洞。有什么想法吗?