【问题标题】:Memory Leak in returning NSMutableArray from class从类返回 NSMutableArray 时出现内存泄漏
【发布时间】:2011-02-24 01:32:15
【问题描述】:

我对 iPhone 上的 Objective C 很陌生,所以我希望你不会因为问一个简单的问题而杀了我。

我制作了一个运行良好的应用程序,除了 Instruments 报告来自下面的类的内存泄漏。我用它来存储一个类的设置,然后从另一个类中检索它们。这些设置存储在一个文件中,因此每次运行应用程序时都可以检索它们。

我能做些什么来释放“设置”,有什么可以做的以更智能的方式调用(使用)类?

谢谢

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

【问题讨论】:

    标签: objective-c class memory-leaks


    【解决方案1】:

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

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

    【讨论】:

    • 你好。尝试了自动释放,但它不起作用。还是一样的结果。不过感谢您的尝试。
    • 更多细节。在代码中使用 autorelease 运行时,应用程序不会在 Instruments 运行的手机上启动。没有仪器它工作正常,但它没有自动释放;-)
    【解决方案2】:

    或者,更好:

    1. settings 属性声明为retaining 属性,然后
    2. 在您的-getParameters 方法中使用self.settings 而不是settings,最后
    3. 在分配/初始化阵列后立即在阵列上调用 autorelease

    【讨论】:

    • Thanks Yang 只是一个问题,在为 iPhone 编码时我应该避免 aurorelease 吗?
    • 我会说这取决于您的应用程序。最后,您以性能换取可读性。有关利弊的讨论,请参阅 stackoverflow.com/questions/193288/…stackoverflow.com/questions/613583/…。在我的建议中,您可以执行以下操作,而不是“(3) call autorelease”: NSArray *tempArray = [[NSMutableArray alloc] init...]; self.settings = tempArray; [tempArray 发布];
    【解决方案3】:

    通过修改两行来解决设置类:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-29
      • 2011-01-21
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多