АРК: Является ли этот подход правильным - PullRequest
2 голосов
/ 19 марта 2012

Это может звучать как вопрос новичка, однако я новичок в разработке для iOS.

У меня следующий код в моем проекте, в проекте включена поддержка 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 в цикле for и ожидать, что обратный вызовработать правильно, если нет, подскажите, пожалуйста, что нужно изменить?

PS Нужно ли менять mFlickr на локальную переменную?Если да, как мне гарантировать, что методы param1 и param2 - это те, которые я пропустил для итерации цикла for?

Ответы [ 3 ]

1 голос
/ 19 марта 2012

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

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

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

0 голосов
/ 19 марта 2012

Вы установили @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 голосов
/ 19 марта 2012

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

[mFlicker setDelegate:self]
...