Утечка памяти при возврате NSMutableArray из класса - PullRequest
2 голосов
/ 26 мая 2010

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

Я сделал приложение, которое отлично работает, за исключением того, что 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];

Ответы [ 3 ]

1 голос
/ 26 мая 2010

Или, еще лучше:

  1. объявите свойство settings как свойство retain ing, затем
  2. используйте self.settings вместо settings в вашем -getParameters методе и, наконец,
  3. вызовите autorelease в ваших массивах сразу после их выделения / включения.
1 голос
/ 26 мая 2010

В вашем -getParameters методе вы выделяете / инициализируете NSMutableArray ([[NSMutableArray alloc] initWithContentsOfFile:filePath] - т.е. сохраняете счетчик 1), который вы никогда не выпускаете. Вы должны автоматически освободить ваш массив перед его возвратом: return [settings autorelease].

Обратите внимание, что если вам нужно поместить параметры настройки в переменную mySettings и вы хотите сохранить их, вы должны сделать mySettings = [[aSetting getParameters] retain];, чтобы количество сохранений не уменьшилось до 0.

0 голосов
/ 27 мая 2010

Удалось решить класс Settings, изменив две строки:

1: Использование параметров = [NSMutableArray arrayWithContentsOfFile: filePath] вместо параметров = [[NSMutableArray alloc] initWithContentsOfFile: filePath]

2: Аналогичным образом, используя settings = [NSMutableArray arrayWithObjects: вместо settings = [[NSMutableArray alloc] initWithObjects

Теперь мне нужно только устранить утечку, которую я имею, когда создаю их из другого класса.Есть идеи как?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...