这听起来像是一个新手问题,但我是新的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。
答案 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");
}
当你的弱引用时,这是一个很好的做法。试试这个。