内存从类返回NSMutableArray时泄漏

时间:2010-05-26 08:09:13

标签: objective-c class memory-leaks

我对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];

3 个答案:

答案 0 :(得分:1)

-getParameters方法中,您分配/初始化一个永不释放的NSMutableArray([[NSMutableArray alloc] initWithContentsOfFile:filePath] - 即保留计数为1)。您应该在返回之前自动释放数组:return [settings autorelease]

请注意,如果您需要将设置参数放在mySettings变量中并希望保留它,则应执行mySettings = [[aSetting getParameters] retain];以使保留计数不会降至0。

答案 1 :(得分:1)

或者,更好的是:

  1. settings属性声明为retain属性,然后
  2. self.settings方法中使用settings代替-getParameters,最后
  3. 在分配/输入后立即在阵列上调用autorelease

答案 2 :(得分:0)

通过修改两行来管理解决Settings类:

1:使用     settings = [NSMutableArray arrayWithContentsOfFile:filePath] 代替     settings = [[NSMutableArray alloc] initWithContentsOfFile:filePath]

2:以类似的方式使用      settings = [NSMutableArray arrayWithObjects: 代替      settings = [[NSMutableArray alloc] initWithObjects

现在我只需要解决从另一个类创建这些漏洞时的漏洞。有什么想法吗?