iOS Singletons и управление памятью - PullRequest
9 голосов
/ 19 ноября 2010

Я уверен, что мне не хватает фундаментального понимания управления памятью iOS, и, несмотря на большое чтение и поиск, я все еще не понимаю его.

Я использую в своем приложении синглтон, которыйсодержит информацию о пользователе, который в данный момент вошел в него, информацию, доступную из нескольких контроллеров представления и т. д. Он имеет несколько иваров, которые получают и устанавливают в приложении.Они объявляются и присваиваются в файле .h следующим образом:

NSString *myString;

и сохраняются следующим образом:

@property (non atomic, retain) NSString *myString;

и синтезируются в реализации.

Я получаю и устанавливаю их значения в методах в синглтоне так:

myString = @"value";

и

methodLocalString = myString;

В других местах я включаю синглтон - назовите его CurrentUser - я импортирую это:

#import "CurrentUser.h"     

За пределами синглтона я получаю и устанавливаю его так:

[CurrentUser sharedCurrentUser].myString = @"Bob";

и

myOutsideString = [CurrentUser sharedCurrentUser].myString;

Большинствовремя, когда это прекрасно работает, с соответствующими значениями, сохраняемыми от одного получения или установки к другому.Проблема в том, что иногда, когда я получаю их таким образом, я обнаруживаю, что они были выпущены (вылетает приложение), что, к счастью, сообщает NSZombieEnabled.

Чего я не понимаю, так это того, как это может произойти.Я думал, что синглтон никогда не был выпущен, и что сохраненные свойства синглтона никогда не будут выпущены.Я отмечу, что проблема, кажется, более распространена со свойствами нереальных объектов, таких как NSDate, и свойствами, определенно не объектными, такими как int и BOOL, которые не могут быть сохранены, но это также происходит со свойствами объекта.

Что я тут не знаю?И спасибо за ваше терпение.

Ответы [ 2 ]

14 голосов
/ 19 ноября 2010

Ваша проблема:

Я получаю и устанавливаю их значения в методах в синглтоне вот так:

myString = @"value";

Когда вы присваиваете iVar напрямую, вместо использования синтаксиса свойства (self.myString = @"value"), вы обходите метод синтезированного сеттера, что означает, что retain никогда не происходит.

Свойства не волшебны. Они просто немного синтаксического сахара для "." доступ и возможность синтезировать методы получения / установки, чтобы избавить вас от необходимости писать свои собственные.

self.myString = @"value";

это просто сокращение для

[self setMyString:@"value"];

Синтезированный метод setMyString будет делать что-то вроде:

if (myString != newValue) {
    [myString release];
    myString = [newValue retain];
}

(при условии retain в @synthesize)

0 голосов
/ 19 ноября 2010

Не используйте синглетоны. Ваша текущая проблема вызвана простым неправильным представлением об управлении памятью, но шаблон синглтона только даст вам больше головной боли в долгосрочной перспективе.

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