gpt4 book ai didi

iphone - Objective-C 中的 "super"是什么? ( self != super )?

转载 作者:可可西里 更新时间:2023-11-01 03:06:44 26 4
gpt4 key购买 nike

我已阅读下面的问题,故事SEEMS很简单:

What exactly is super in Objective-C?

还...

- (id) init
{
NSLog(@"self=%p, super=%p", self, super);
}

打印出“self=0xa83dc50, super=0xbfffe8d0”。地址不一样???!?!?

第二个地址似乎是一个“特殊值”之类的东西。什么意思?

感谢 bbum 指出这个值是编译器用来实现“ super ”行为的特殊结构的堆栈地址。


我可以调用 [super init] 并且调用似乎有效,或者至少没有爆炸……不会立即发生。调用 [((id)0xbfffe8d0) init] 失败并返回 EXC_BAD_ACCESS。

然后是非常奇怪的部分......我有一段代码无缘无故地抛出了“NSGenericException:集合在被枚举时发生了突变”异常。在一个不同的对象(基本上是一个具有指向 NSEnumerator 的指针的包装器)内,注释掉对“[super init]”的调用会导致异常不会发生。如果可以的话,我会悬赏 $$$ 奖励那个令人费解的答案。

"id sups = (id)0xbfffe8d0"... 这也会导致“集合已修改”。 ... WTF?好的,所以我要发布第二个问题来解决这个奇怪的问题......


我最初是带着那些“奇怪的症状”错误之一来到这里的,结果证明它们完全无关(此类事情的典型):Does casting an address to (id) have side-effects??? Is Address 0xbfffe8d0 special? (fixed: issue was with _NSCallStackArray)

然而,线以上的内容仍然有效,反响也很好。如果您想更深入地了解 ObjC,请阅读它。

最佳答案

你在惹幕后的那个人,他正在为此惩罚你......:)

super 确实有点像编译器魔法。当您说 [super doSomething] 时,编译器将调用 objc_msgSendSuper() 而不是 objc_msgSend()。大多数时候 -- 有一些特殊情况。

一般来说,您应该将 super 视为仅用于方法调用的目标。它永远不应存储在任何地方,也永远不应被视为任何消息传递的目标表达式。

事实上,涉及存储的 super 的使用应该被编译器标记。

就您的错误而言,这听起来很像内存损坏、过度释放和/或并发。您需要提供更多与枚举相关的代码和其他相关代码以进一步推断。

关于iphone - Objective-C 中的 "super"是什么? ( self != super )?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9961527/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com