Не могу понять, почему мой объект освобождается - PullRequest
0 голосов
/ 30 августа 2010

У меня есть объект NSDate, который я использую в основном потоке моего приложения для iPhone, и я также ссылаюсь на него из фонового потока, он определен так:

//header
NSDate *currentDate;
@property (nonatomic, retain) NSDate *currentDate;

//implementation file
@synthesize currentDate;

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

- (void) reloadData: (NSInvocationOperation*)operation  
{
    //...
    NSMutableArray *results = [managerHelper refreshForAddress: address 
                                                      timeFrom: fromDate
                                                        timeTo: self.currentDate];
    //...
}

(обратите внимание, что вышеуказанный вызов находится в фоновом потоке)

Теперь, в этом вспомогательном классе, я добавил эти строки

- (NSMutableArray*) refreshForAddress:(NSString *)address 
                            timeFrom:(NSDate*) fromDate 
                              timeTo:(NSDate*) toDate
{
    debugLog(@"retain count: %i", [toDate retainCount]);
    NSNumber *toTimeNumber = [[NSNumber alloc] initWithDouble: [toDate timeIntervalSince1970]*1000];
    debugLog(@"after retain count log");
}

Но я получаю классическую ошибку: "*** - [__ NSDate timeIntervalSince1970]: сообщение отправлено освобожденному экземпляру 0x71beea0"

И в журнале написано:

MyApp [5487: 7903] сохранить счет: 2 MyApp [5487: 7903] *** - [__ NSDate timeIntervalSince1970]: сообщение отправлено освобожденному экземпляру 0x71beea0

Итак, как вы можете видеть, последний оператор журнала не вызывается, но retainCount равен 2, как это может быть, когда я получаю эту ошибку в строке после вызова журнала ???

Ответы [ 2 ]

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

Вы сказали, что используете два или более потоков. Итак, вы должны определить свойство следующим образом:

@property (retain) NSDate *currentDate;  ///< atomic default

Этот способ гарантирует потокобезопасность для этого свойства.

Edit:

Удалите «nonatomic» из @property, и он будет работать как атомарная операция по умолчанию. Атомарная операция гарантирует поточно-ориентированное поведение.

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

Способ, которым вы инициализируете NSDate, возвращает экземпляр автоматического выпуска, который будет автоматически отменен в конце цикла событий. Используйте [[NSDate date] retain] и не забудьте отпустить его вручную.

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