奇怪的BAD_ACCESS错误

时间:2012-02-29 12:24:23

标签: objective-c ios ios5 automatic-ref-counting

这听起来像是一个新手问题,但我是新的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 / _weak限定符用法或smth。

3 个答案:

答案 0 :(得分:1)

该消息表示mRequest已取消分配,字符串现在正在使用先前为mRequest分配的内存。

您应该在启用Zombies的情况下运行您的应用,以了解何时取消分配mRequest

答案 1 :(得分:0)

看起来tokenManager未被请求保留(这是库中的错误)。因为它没有保留在任何地方,所以tokenManager被解除分配,并且可以在同一个地方分配一个新对象(这里是NSString的实例)。

您需要将tokenManager存储在强实例变量(就像mRequest)中,以便在请求需要时保留它。

答案 2 :(得分:0)

如果您有任何弱引用,请尝试使用

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

当你的弱引用时,这是一个很好的做法。试试这个。