You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用NSSharingServicePicker类时出现非法子类实例化警告求助

解决NSSharingServicePicker使用时的"非法实例化子类SHKRemoteView"警告

这个警告我之前在项目集成ShareKit的时候也碰到过,本质是系统ViewBridge框架不允许子类化NSRemoteView,但ShareKit里自定义了SHKRemoteView继承自它,所以触发了这个警告。

先看一下你遇到的完整警告日志:

2018-05-03 18:31:54.879424+0800 writer[5656:137819] warning: 非法实例化子类SHKRemoteView;客户端应仅使用NSRemoteView ( 0 ViewBridge 0x00007fff7a0cabff -[NSRemoteView _preSuperInit] + 195 1 ViewBridge 0x00007fff7a0caf83 -[NSRemoteView initWithFrame:] + 25 2 ShareKit 0x00007fff763b7aa5 -[SHKRemoteView initWithOptionsDictionary:] + 161 3 ShareKit 0x00007fff76396fbd 38-[SHKSharingService performWithItems:]_block_invoke_4 + 1347 4 libdispatch.dylib 0x00000001019eacfe _dispat...

解决方法:

  • 直接修改ShareKit源码(最可靠):
    找到ShareKit中的SHKRemoteView类,把它的继承关系从NSRemoteView改成直接使用NSRemoteView,移除自定义的子类实现。因为SHKRemoteView大多只是做了简单的初始化封装,替换成系统原生的NSRemoteView就能满足功能需求,同时避免触发系统警告。

    具体操作:

    1. 定位到SHKRemoteView.h和SHKRemoteView.m文件;
    2. 删除自定义的SHKRemoteView类,在原本使用它的地方(比如SHKSharingService相关代码)直接创建NSRemoteView实例;
    3. 调整初始化逻辑,把原本-[SHKRemoteView initWithOptionsDictionary:]里的逻辑迁移到NSRemoteView的初始化过程中。
  • 尝试升级ShareKit:
    如果项目里用的是旧版ShareKit,可以查一下官方仓库有没有更新版本——有些老库会在后续版本修复这类系统兼容性问题。不过考虑到这个警告日志是2018年的,ShareKit可能已经停止维护,这条不一定能解决,但可以先试试。

  • 运行时替换(不推荐,仅作备选):
    要是不想修改源码,可以用Objective-C的运行时特性,把SHKRemoteView的初始化方法替换成创建NSRemoteView实例的逻辑。但这种方法容易引入兼容性问题,后续系统更新可能出问题,所以只建议在紧急情况下临时用。

这个问题的核心就是系统限制了NSRemoteView的子类化,只要绕开ShareKit的自定义子类,直接用系统类就能解决啦。

内容的提问来源于stack exchange,提问作者Simon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:41:14