【问题标题】:Strange BAD_ACCESS error奇怪的 BAD_ACCESS 错误
【发布时间】:2012-03-18 22:33:06
【问题描述】:

这听起来可能是一个新手问题,但我是新的 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。

【问题讨论】:

  • 搜索 NSZombieEnabled - 这个错误几乎总是由向一个对象发送一个错误的方法引起的,当一个对象被释放并且另一个对象被分配在同一位置时,这又会发生

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


【解决方案1】:

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

您应该在启用 Zombies 的情况下运行您的应用,以了解 mRequest 何时被释放。

【讨论】:

  • 但是 __strong 限定符不保证它会继续存在吗?
  • 基本上我想知道它为什么会被释放?
  • __strong 确实应该让它保持活力。您的代码中的其他地方一定还有另一个问题。 Instruments 会告诉你僵尸对象被释放的确切位置。这将使您能够追踪问题。
【解决方案2】:

看起来tokenManager 没有被请求保留(这是库中的一个错误)。由于它没有保留在任何地方,tokenManager 被释放,并且可以在同一位置分配一个新对象(这里是 NSString 的实例)。

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

【讨论】:

  • 使用 __strong 限定符创建 tokenManager 成员没有帮助,它仍然崩溃......
  • 添加 __strong 限定符是不够的:您需要将变量声明为实例变量,就像为 mRequest 所做的那样。
  • 引用我之前的消息“使用 __strong 限定符制作 tokenManager 成员”...所以我已经这样做了
【解决方案3】:

如果你有任何弱引用尝试使用

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

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

【讨论】:

  • 我在问题中看不到任何弱引用。我不知道这有什么帮助。
  • 我没有看到您问题中的界面。我不知道我怎么会知道!您说“我猜它来自 ARC _strong/_weak 限定符的使用或 smth。”因此可以理解您可能使用了弱引用。
猜你喜欢
  • 1970-01-01
  • 2011-10-25
  • 2010-11-17
  • 1970-01-01
  • 2014-10-11
  • 2012-04-27
  • 2013-10-30
  • 2016-09-18
  • 2015-05-13
相关资源
最近更新 更多