сохранить имущество указывает на неправильный адрес - PullRequest
3 голосов
/ 30 августа 2011

У меня есть одноэлементный класс с иваром по имени форматер. Есть некоторый код:

@interface SettingsController : NSObject {

    NSDateFormatter *formatter;  
}

@property (nonatomic,retain,readwrite)  NSDateFormatter *formatter;




@implementation SettingsController

@synthesize formatter,;

SYNTHESIZE_SINGLETON_FOR_CLASS(SettingsController);

-(id)init
{
 if ( (self = [super init]) )
  {
        ...
        self.formatter = [[[NSDateFormatter alloc] init] autorelease];
        ...
  }

Проблема в том, что когда-нибудь, когда я пытаюсь получить этот форматер, вот как:

[[SettingsController sharedSettingsController] formatter]

Значение пропущено. Есть NSDate, NSString или даже мой собственный экземпляр класса по адресу, который указывает форматер.

Я пытаюсь использовать [[NSDateFormatter alloc] init], но только [[[NSDateFormatter alloc] init] retain] сохраняет проблему исчезнуть.

Как это может быть, когда я использую @property (nonatomic, retain , readwrite) и никогда не сбрасываю этот ivar на другое значение?

РЕДАКТИРОВАТЬ: После того, как я сделал подкласс для NSDateFormatter, я ясно и легко видел релиз, который делает приложение падения. Большое спасибо progrmr!

1 Ответ

1 голос
/ 30 августа 2011

Вы пишете о классе SettingsController, но используете класс SyncProgress. Что это?

Если вы правильно @synthesize d @property, то, что вы сделали в показанном вами init методе, должно быть правильным, если вы не освобождаете свойство - или, по крайней мере, тот же объект, от любой ссылки на него, которую вы можете иметь - позже, в том же методе или в другом месте. Другими словами, не выпускает автоматически выпущенный элемент .

FWIW, статья , которая описывает макрос , говорит, что вы должны объявить

+ (SettingsController *) sharedSettingsController;

Я не вижу, как ты это делаешь, не так ли?

И вы используете класс SyncProgress, а не SettingsController. Предполагая, что вы объявили, что вы тоже синглтон, вы должны сделать то же самое для SyncProgress:

+ (SyncProgress *) sharedSyncProgress; 

Что такое метод init для SyncProgress? Вы тоже там поставили formatter, и есть ли он вообще? Или вы просто смотрите не на тот класс ?

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