【问题标题】:Object comes back NSArrayReverseEnumerator. Causes unrecognized selector sent to instance对象返回 NSArrayReverseEnumerator。导致无法识别的选择器发送到实例
【发布时间】:2012-06-12 19:33:13
【问题描述】:

我有一些代码应该返回一个 NSString。相反,它有时会返回一个 NSArrayReverseEnumerator。这会导致无法识别的选择器发送到实例异常。

NSString *tFirstName = nil;
NSString *tUsername = ((NSString*)[self.userObject objectForKey:USER_NAME]).length > 0 ? [self.userObject objectForKey:USER_NAME] : [self.userObject objectForKey:USER_USERNAME];
NSRange spaceRange = [tUsername rangeOfString:@" "];
if (spaceRange.location == NSNotFound) {
    tFirstName = tUsername;
} else {
    tFirstName = [tUsername substringToIndex:spaceRange.location];
}
return tFirstName;

然后我将 UITextField 文本属性设置为返回的导致异常的内容。

例外是:

-[__NSArrayReverseEnumerator isEqualToString:]:无法识别的选择器发送到实例 0xf1b8190

这是堆栈跟踪的最后几行:

 CoreFoundation 0x381208bf __exceptionPreprocess + 163
1 libobjc.A.dylib 0x31c061e5 objc_exception_throw + 33
2 CoreFoundation 0x38123acb -[NSObject doesNotRecognizeSelector:] + 175
3 CoreFoundation 0x38122945 ___forwarding___ + 301
4 CoreFoundation 0x3807d680 _CF_forwarding_prep_0 + 48
5 UIKit 0x354dc20d -[UILabel setText:] + 45
6 Trivial 0x000873c9 -[vcGameOver viewDidLoad] (vcGameOver.m:45)
7 UIKit 0x355117ff -[UIViewController view] + 167

userObject 正常情况下是这样的,但无法在调试器中重现,还不能查看异常时的情况:

userObject 看起来像这样:

(PFUser *) $1 = 0x0be86fb0 <PFUser:MTsJR1DKuS> {
    answeredCorrect = "<PFRelation: 0xa847f30>";
    centsEarned = "-2353";
    centsPaidFor = 5000;
    centsUsed = 4193;
    correctAnswers = 1454;
    earnedCoinDate = "2012-06-12 19:42:44 +0000";
    eloRating = 1262;
    iq = 119;
    lastPlayedDate = "2012-06-12 19:15:46 +0000";
    locale = en;
    losses = 10;
    name = "Matt Hudson";
    status = 0;
    username = Inturbidus;
    wins = 8;
    wrongAnswers = 1157;
} 

我的问题是,我上面代码中的哪一行可能返回一个 NSArrayReverseEnumerator?

【问题讨论】:

  • 请 NSLog self.userObject
  • tFirstName 定义在哪里?
  • 上面写着 NSString *tFirstName = nil;
  • 是的,它是“名称”的常量

标签: objective-c ios ios5


【解决方案1】:

可能有一个悬空指针,其他一些对象(在这种情况下,可能是 Apple 私有的 __NSArrayReverseEnumerator)蹲在内存中 您的位置 em> 过早释放NSString 实例曾经是。

我建议打开僵尸 (NSZombieEnabled) 并查看您是否收到“message sent to deallocated instance”错误消息而不是您收到的错误消息。

【讨论】:

  • 我启用了 Zombies,但在模拟器中没有收到错误消息。我想我需要更多的测试。你能指点我一个讨论悬空指针的网站吗?
  • @inturbidus 如果您在启用僵尸的情况下没有收到“message sent to deallocated instance”错误,但继续收到原来的“unrecognized selector sent to ...”错误,则可能是缓冲区溢出之类的其他问题。例如,在你已经 malloc'ed 的内存缓冲区的范围之外写入或索引 C 数组超出其声明的大小。
  • @inturbius 看看这个另一个stackoverflow线程,它也有__NSArrayReverseEnumerator (stackoverflow.com/questions/4848137/…)。
  • 这个提示可能对我有足够的帮助,让我看到我有一个分配,它应该是一个强大的,导致它成为一个悬空指针。
猜你喜欢
  • 2017-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-28
  • 2012-07-24
相关资源
最近更新 更多