Проблема памяти Objective-C - PullRequest
       22

Проблема памяти Objective-C

2 голосов
/ 26 февраля 2011

У меня проблема с управлением памятью в моем приложении. У меня есть переменная экземпляра NSDictionary, который я устанавливаю равным другому NSDictionary, который создается в методе. Это все работает нормально, и мое приложение ведет себя так, как я хочу, но у меня возникают проблемы с применением правильного управления памятью.

Если я выпускаю локальный словарь, это в конечном итоге вызывает сбой, так как метод вызывается неоднократно, потому что данные, сохраненные в переменной экземпляра, также удаляются. Вот код:

NSBundle *bundle = [NSBundle mainBundle];
NSString *plistPath = [bundle pathForResource:@"Names" ofType:@"plist"];

NSDictionary *dictionary = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
self.dictAllValues = dictionary;
[dictionary release];

Ответы [ 3 ]

2 голосов
/ 26 февраля 2011

Создать dictAllValues, используя

 @property(retain) NSDictionary *dictAllValues;

Ваш метод

-(void) myMethod
{
NSBundle *bundle = [NSBundle mainBundle];
NSString *plistPath = [bundle pathForResource:@"Names" ofType:@"plist"];

NSDictionary *dictionary = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
self.dictAllValues = dictionary;
[dictionary release];
}

и выпустить в методе dealloc

-(void) dealloc
{
[dictAllValues release];
[super dealloc];
}
1 голос
/ 26 февраля 2011

Как вы объявляете dictAllValues?Как правило, это будет:

 @property(retain) NSDictionary *dictAllValues;

Если это так, то release в вашем коде является правильным, и ваша проблема лежит в другом месте.Опубликуйте обратный след аварии, используйте Build and Analyze, исправьте все ошибки и попробуйте включить обнаружение зомби.

1 голос
/ 26 февраля 2011

Из руководства по управлению памятью Apple .

Как следствие фундаментального правила, если вам нужно сохранить полученный объект как свойство в переменной экземпляра, вы должны сохранить или скопировать его.

Таким образом, в этом случае вместо использования [dictionary release]; в методе dealloc (или любом другом методе, который вы можете использовать для очистки), все должно работать нормально.

Полагаю, ваше свойство dictAllValues использует простое присваивание, дайте мне знать, если это не так.

...