1

我有如下调用堆栈的崩溃报告。由于我无法重新生成错误,我必须猜测发生了什么。

NSInvalidArgumentException
---------------------
-[__NSBlockVariable__ profile_data]: unrecognized selector sent to instance 0xab2f620
---------------------
0 CoreFoundation 0x378688a7 __exceptionPreprocess + 186
1 libobjc.A.dylib 0x35d6e259 objc_exception_throw + 32
2 CoreFoundation 0x3786ba9b -[NSObject doesNotRecognizeSelector:] + 174
3 CoreFoundation 0x3786a915 ___forwarding___ + 300
4 CoreFoundation 0x377c5650 _CF_forwarding_prep_0 + 48
5 TouchPalDialer 0x0005096f -[InfoEditViewControllerNew textFieldDidEndEditing:] + 134

引发崩溃的代码应该类似于

profile_data_manager.profile_data.name = [textField.text stringByTrimmingCharactersInSet:whitespace];

profile_data_manager 肯定是类类型 ProfileDataManager,并且肯定有 property@property(nonatomic, retain) ProfileModel *profile_data;

我不知道为什么 profile_data_manager 变成了NSBlockVariable,以及为什么它不能识别 profile_data。

我看到这篇文章Calling delegate method, unrecognized selector because sent to wrong object说将非原子更改为原子解决了他的问题。

我不确定我的崩溃是否出于同样的原因。如果有人可以向我展示一些关于 NSBlockVariable 的资源解释,那就太好了,这样我就可以更好地理解原因。

谢谢!

4

2 回答 2

0

因为您的对象准备通过 ARC 发布。要解决此问题,请确保将变量放在全局变量中,因此,它仅在父对象释放时才释放。

于 2013-07-10T04:02:46.043 回答
0

您的项目使用 ARC 吗?我假设不是。确保你没有过度释放profile_data_manager

以我的经验,这种类型的错误意味着一个对象已过早释放,并且它的内存已被重用于保存新对象的实例。在这种情况下,一个NSBlockVariable.

您可以尝试对您的项目进行分析构建以查找可能的引用计数(保留/释放)错误。

您还可以尝试在打开僵尸的情况下运行您的项目...(请参阅 Instruments 中的分配工具并启用僵尸选项)。这可以跟踪引用计数错误。(假设这一个引用计数错误)......但这似乎很可能。

于 2012-09-10T09:08:59.270 回答