Swift开发FxPlug插件:自定义参数添加NSView崩溃问题求助
根据你遇到的错误信息<Studio_UI_XPC_Service.SimpleTestView 0x120821c60> has reached dealloc but still has a super view,核心问题是自定义NSView的内存管理异常——视图被标记为释放,但仍存在于父视图层级中,通常是强引用循环或生命周期处理不当导致,以下是针对性的解决步骤:
修正
createView中的视图引用逻辑
FxPlug框架会负责持有参数视图的引用,不要在该方法中对自定义视图使用weak修饰符,直接返回强引用的实例即可,避免视图被提前释放:override func createView(for parameter: FxParameter) -> NSView? { guard parameter.identifier == "CustomLogoParameter" else { return super.createView(for: parameter) } // 直接创建并返回强引用的视图实例 let customView = SimpleTestView(frame: NSRect(x: 0, y: 0, width: 200, height: 50)) return customView }消除自定义视图内的循环引用
如果SimpleTestView内部需要引用FxPlug参数对象,必须使用weak修饰符,避免与框架形成强引用循环:class SimpleTestView: NSView { // 使用weak修饰参数引用,打破循环 weak var associatedParameter: FxParameter? // 其他视图逻辑... }禁止在
deinit中手动移除视图
父视图会强引用子视图,当FxPlug框架处理视图生命周期时,会自动将其从父层级移除,不要在SimpleTestView的deinit方法中调用removeFromSuperview(),否则会触发重复释放逻辑:class SimpleTestView: NSView { deinit { // 不要调用removeFromSuperview() // 仅处理视图内部资源的释放 } }确保自定义参数注册正确
在addParameters方法中,必须使用FxCustomParameter类型创建自定义参数,并设置唯一标识符,保证视图与参数的关联匹配:override func addParameters() { let customParam = FxCustomParameter(identifier: "CustomLogoParameter", name: "Logo") addParameter(customParam) // 注册其他常规参数... }延迟视图内的框架依赖操作
不要在SimpleTestView的init(frame:)方法中直接访问FxPlug框架相关对象,将依赖框架的逻辑放在viewDidMoveToSuperview()中执行,确保视图已正确加入父层级:class SimpleTestView: NSView { override func viewDidMoveToSuperview() { super.viewDidMoveToSuperview() // 在这里执行需要依赖父视图或FxPlug环境的操作 } }
内容的提问来源于stack exchange,提问作者Marin Nagy

