【问题标题】:MonoTouch "unrecognized selector sent to instance" not working on iOS5 (but does on iOS6)MonoTouch“发送到实例的无法识别的选择器”在 iOS5 上不起作用(但在 iOS6 上起作用)
【发布时间】:2025-12-22 19:50:12
【问题描述】:

我在使用 MonoTouch 链接 Aviary SDK 时收到以下错误。

-[__NSArrayM objectAtIndexedSubscript:]:无法识别的选择器发送到实例 0x9b0f1d0

当我尝试推送链接的控制器时出现问题。

PresentViewController(photoEditor, true, new NSAction(() => {}));

我已将我的项目推送/分享到https://github.com/theonlylawislove/MonoTouch.Aviary,您可以在那里重现问题。

我的演示应用程序在 iOS 6 模拟器上运行,但在 iOS 5 模拟器(和设备)上发生了上述错误。

我直接从最新的 Aviary SDK 3.0 中获取了所有内容 (.a/bundles)。他们提供的演示应用程序(具有相同的 .a 库)在 iOS 5 上运行,因此问题一定出在 MonoTouch 和链接上。

这是我的链接标志。

[assembly: LinkWith ("libAviarySDK.a", 
                     LinkTarget = LinkTarget.ArmV7 | LinkTarget.Simulator, 
                     ForceLoad = true, 
                     IsCxx = true,
                     Frameworks="Accelerate CoreData CoreText Foundation MessageUI OpenGLES QuartzCore StoreKit SystemConfiguration UIKit", 
                     WeakFrameworks="AdSupport",
                     LinkerFlags="-ObjC -all_load -fobjc-arc -lz -lsqlite3.0")]

有什么想法吗?提前致谢!由于 Aviary 不提供 MonoTouch 绑定,因此我希望能够与社区分享该解决方案。

【问题讨论】:

    标签: c# linker xamarin.ios aviary


    【解决方案1】:

    补充@Poupou 的回答,在iOS 5 中很容易使该选择器可用,您只需链接libarclite.a

    这是一个 Xamarin.iOS 绑定的sample,如果您愿意,也可以从那里获取libarclite.a

    只需将libarclite.a 添加到您的绑定项目中,您就可以开始了。

    希望对你有帮助

    亚历克斯

    【讨论】:

    • @dalexsoto 你救了我的命!非常感谢!给我你的贝宝电子邮件,我会给你一个小费!
    • @PaulKnopf 不客气 :) 没必要,我很高兴能帮上忙
    • 这里的“绑定”是指在项目实例上单击鼠标右键时选择“添加本机引用”选项。 (因为一开始这对我来说并不那么明显)。
    【解决方案2】:

    这个错误是正确的,因为objectAtIndexedSubscript: 选择器在iOS5 中不可用。见:Is objectAtIndexedSubscript available in IOS5?

    他们提供的演示应用程序(具有相同的 .a 库)适用于 iOS 5

    这并不意味着您的演示与原始演示的代码路径相同。您可能正在执行原始演示可以解决的问题。

    如果这来自 Aviary SDK(而不是来自您的代码),那么您需要:

    • 来自他们的修复;或
    • 关于如何避免使用此选择器的代码路径的一些线索(如果他们的演示在 iOS5 上运行并且可以满足您的要求,则必须有一个);或
    • 旧版本仍与 iOS5 兼容。

    【讨论】: