2012-03-19 3 views
2

Это может звучать новичком, но я новичок в iOS-разработчике.ARC: Правильно ли этот подход

У меня есть код в моем проекте, проект включен ARC, и я получаю ошибку при его выполнении (плохой доступ) и хотел бы понять причину проблемы и решить ее.

на некоторой кнопки нажмите следующий код вызывается в MTClassA.m файле

-(void) someMethod 
{ 
    for (int i = 0; i < N; i++) { 
     ... 
     (param1 and param2 are location variables) 
     ... 
     mFlickr = [[MTFlickr alloc] initWithParam1:param1 param2:mparam2]; 
     mFlickr.delegate = self; 
     [mFlickr fetchImages]; 
    } 
} 

в MTClassA.h заголовка файла mFlickr объявлен как MTFlickr* mFlickr так по умолчанию это его __strong классификатором.

функция обратного вызова fetchImages класса следующие

- (void)didRecieveImageLinksFromFlickr:(NSArray*)response 
           param1:(NSString*)param1 param2:(NSString*)param2 { 
    ... 
} 

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

P.S. Мне нужно изменить mFlickr на локальную переменную? Если да, то как мне следует гарантировать, что методы param1 и param2 являются тем, что я прошел для обучения итерации в цикле?

+0

Как-то вам нужно сохранить несколько объектов «MTFlickr» (возможно, в «NSMutableArray»), потому что ваш цикл поддерживает только текущий объект только в том случае, если у вас есть только один предполагаемый сильный указатель, который по этой области, 'mFlickr'. – holex

ответ

1

Вы создаете несколько экземпляров объекта mFlickr в пределах вашего цикла, и, предположительно, назначая их на та же переменная экземпляра. В ARC присваивание переменной экземпляра автоматически выдает предыдущее значение, поэтому ваши объекты mFlickr будут уничтожены сразу после их создания (кроме последнего).

Предположительно, ваш объект mFlickr устанавливает себя как делегат для запроса URL-адреса, вероятно, этот обратный вызов не работает, поскольку делегат запроса больше не существует.

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

+0

Wow спасибо за подробный ответ. Честно говоря, я также поддерживаю массив, но считаю, что это не очень приятное решение. Имеет ли смысл достичь этого, используя __autoreleasing для объекта mFlickr или заставить ARC не удалять предыдущий объект mFlickr, но освобождать он в обратном вызове (вроде make-объекта как «утечка памяти» ... надеюсь, вы получите мою идею) ... – deimus

+0

Честно говоря, я думаю, что массив является более приятным решением, чем попытка заставить ARC что-либо сделать. Вы не можете вручную выпускать объекты под ARC, чтобы ваша вторая идея не сработала. Что-то где-то нуждается в сильном указателе на каждый объект mFlickr, у вас есть переменное число из них, массив кажется разумным. – jrturton

+0

Хорошо спасибо за разумный ответ :) !!! – deimus

0

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

[mFlicker setDelegate:self] 
+0

Да, извините, исправлено в исходном сообщении – deimus

+0

Но в этом случае правильно ли правильно настроить callout? Я имею в виду, что параметры выноса «param1» и «param2» могут быть изменены при распределении и инициализации цикла mFlickr in for. Я прав ? – deimus

0

Вы установили @property для mFlicker?

.h 
@property(nonatomic, retain) MTFlickr *mflicker; 

.m 
@synthesis mflicker; 

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

self.mFlickr = [[MTFlickr alloc] initWithParam1:param1 param2:mparam2]; 
mFlickr.delegate = self; 
[mFlickr fetchImages]; 

Я также не уверен, но я просто хотел, чтобы обеспечить некоторую помощь

+0

В принципе, я хотел бы получить решение, используя ARC, а не MRC, может предложить что-то в ARC? – deimus

+0

Извините, удаленный код MRC ... – Krrish

+0

Вы не можете использовать сохранение в режиме ARC также в файле заголовка. И еще одна причина, почему мне нужно объявить свойство в том же классе MTClassA? Я использую mFlickr в этом ... – deimus

Смежные вопросы