NSDraggingDestination协议必选方法疑问:仅实现3个为何可正常运行?
关于NSDraggingDestination协议方法必选/可选的疑问
问题描述
我查看NSDraggingDestination协议文档时发现,拖拽图像的目标对象必须实现该协议的一组方法,共包含9个方法。但我在NSView中仅实现了其中3个方法——
draggingEntered:、prepareForDragOperation:和performDragOperation:,程序编译运行无警告或崩溃。文档未明确区分必选与可选方法,请问这是为什么?
解答
其实这是Cocoa协议里的常见情况——很多老协议虽然文档没明确标注,但内部已经将大部分方法设为可选(optional),只有少数是必选的。
具体到NSDraggingDestination协议:
- 真正的必选方法只有
draggingEntered:,它是拖拽流程的核心入口,系统需要通过它判断是否接受当前拖拽操作,所以必须实现 - 其余的方法(比如
prepareForDragOperation:、performDragOperation:、draggingExited:、concludeDragOperation:等)全都是可选方法。系统在调用这些方法前会先检查你的对象是否实现了它们,若未实现则直接跳过,不会触发崩溃或编译警告
至于文档没明确区分的原因,这属于早期Cocoa文档的遗留问题。苹果在后续推出的新协议中都明确标注了@required和@optional,但像NSDraggingDestination这类老协议的文档没及时更新。不过你去查看协议的头文件(比如<AppKit/NSDragging.h>)就能发现,大部分方法都被标记为@optional。
另外还有个关键点:NSView本身已经默认实现了NSDraggingDestination协议里的部分基础方法,只是这些默认实现要么是空实现,要么只做了最基础的处理。所以你只需要实现业务需要的关键方法即可,其他方法系统会用默认实现兜底,不会出现问题。
内容的提问来源于stack exchange,提问作者Bob Ueland
相关产品推荐
相关产品推荐

