Странная ошибка BAD_ACCESS - PullRequest
       21

Странная ошибка BAD_ACCESS

1 голос
/ 29 февраля 2012

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

недавно я перешел на ARC и получил следующую проблему в своем коде. Я реализовал класс с помощью следующего метода init

- (id)init
{
    self = [super init];
    if (self) {
        TokenManager* tokenManager = [[TokenManager alloc] initWithApikey:<my valid token>];
        mRequest = [[GeoCodingRequest alloc] initWithApikey:apiKey withOptions:nil tokenManager:tokenManager];
        mRequest.delegate = self;
    }
    return self;
}

где mRequest в интерфейсе объявлено так __strong GeoCodingRequest* mRequest;

В моем другом методе того же класса я отправляю сообщение на mRequest вот так

[mRequest findObject:<some valid array> around:<some valid location> withDistance:<some valid radius>];

При отправке сообщения на объект приложение вылетает со следующим сообщением

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString appendRequestWithToken:]: unrecognized selector sent to instance 0x8974640'

findObject: around: withDistance: - это метод из публичной библиотеки, поэтому у меня нет доступа к его реализации.

Пожалуйста, помогите мне понять, почему происходит этот сбой ?! Я предполагаю, что это происходит от ARC _ strong / _слабое использование квалификатора или что-то в этом роде.

Ответы [ 3 ]

1 голос
/ 29 февраля 2012

Сообщение означает, что mRequest было освобождено, если строка теперь использует память, которая ранее была выделена для mRequest.

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

0 голосов
/ 29 февраля 2012

если у вас есть слабые ссылки, попробуйте использовать

MyObject * strongMyObject = weakMyObject;
if(strongMyObject){
   NSLog(@"This is not released");
}

Это хорошая практика, когда у вас есть слабые ссылки. Попробуйте это.

0 голосов
/ 29 февраля 2012

Похоже, что tokenManager не сохраняется запросом (что является ошибкой в ​​библиотеке).Так как он нигде не сохраняется, tokenManager освобождается, и новый объект (здесь экземпляр NSString) может быть размещен в том же месте.

Вам необходимо сохранить tokenManager всильная переменная экземпляра (точно так же, как mRequest), чтобы сохранить его, пока запрос нуждается в этом.

...