- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为另一种编程语言开发一个 GUI 框架,它可以让我瞄准 native 后端,即 Windows 上的 Windows API、Mac OS X 上的 Cocoa 和其他 Unix 系统上的 GTK+。该框架的实际核心仍然是 C 和 Objective-C。我知道我所做的与正常的 Cocoa 方式相反,但我不知道对于其他平台有更好的解决方案。
对于每个 UI 对象(窗口、按钮等),我都需要一定数量的私有(private)数据结构,通常是一两个。您可以将它们视为 Controller 对象的数据字段。有函数 uiWindowDestroy() 和 uiControlDestroy() 可以立即销毁窗口/控件,从而释放进程中的数据结构。 (对于 Objective-C,释放控件是通过调用 release
来实现的。)当数据结构所在的窗口关闭(不仅仅是隐藏/排序)或它们作为子级的窗口/控件被显式销毁。在 Windows 上,我通过处理 WM_DESTROY
来做到这一点;在 GTK+ 上,我通过连接到“destroy”来做到这一点。这两个选项都可以处理这两种情况。
我不知道如何用 Cocoa 处理这个问题。我知道 Controller / View 关系应该是相反的。我知道通过这种关系,我的显式销毁函数很容易,但父对象的自动销毁对我来说并不明显。
现在,这就是我尝试过的:我的 NSWindow 使用自定义 NSView 子类作为内容 View ,这会在 dealloc
中触发其子级销毁。我还对 NSButton 进行了子类化,以在 dealloc
中释放其数据结构。最后,我的 NSWindow 调用了 setReleasedWhenClosed:YES
,并且窗口委托(delegate)在 windowWillClose:
中调用 [self relase]
。所有这些(子)类在 alloc
和 dealloc
中都有特殊的代码,打印出这样的分配/释放正在发生。
以下是我在 10.9 上通过单击标题栏中的关闭按钮关闭窗口(该窗口有两个按钮和一个不受 NSView 支持的伪控件)时得到的结果:
0x7fce53c1a030 alloc uiWindow (window private data; malloc())
0x7fce53c3d670 alloc uiContainer (window content view; NSView)
0x7fce53c0eed0 alloc uiWindowDelegate (window delegate; NSObject)
0x7fce53c0f770 alloc stack (viewless control; malloc())
0x7fce53c195f0 alloc uiSingleViewControl (button private data; malloc())
0x7fce53c0abb0 alloc uiSingleViewControl (button private data; malloc())
0x7fce53c3d0e0 alloc uiControl *[] (viewless control private data; malloc())
0x7fce53c1b8b0 alloc int[] (same)
0x7fce53c0ed10 alloc intmax_t[] (same)
0x7fce53c3bda0 alloc intmax_t[] (same)
0x7fce53c1a030 free
0x7fce53c0eed0 free
如您所见,没有任何自定义控件与 NSWindow 一起被销毁。
我找到了this question这表明在应用程序终止的情况下,默认的自动释放池不会被耗尽;我尝试将各种 release
调用包装在 @autoreleasepool
block 中,但这也不起作用;输出是相同的。
所以我想知道是否有一种可靠的方法来做我想做的事情。我知道当对象被释放时没有发送通知,也没有办法监视通知,而且我很困惑为什么我的助手 Objective-C 对象没有被释放。理想情况下,我根本不需要子类化 NSButton 和其他...
感谢您的理解。
最佳答案
如果窗口由窗口 Controller (NSWindowController
的实例或子类)控制,则 setReleasedWhenClosed:YES
无效。窗口 Controller 对其窗口具有强引用。
同样, View Controller 对其 View 具有强引用。
如果您想在窗口关闭时释放窗口,请务必在 -windowWillClose:
中释放窗口 Controller ,或者以其他方式响应 NSWindowWillCloseNotification
通知。同样,如果您有 View Controller ,则应在使用完它们后释放它们(而不是它们控制的 View )。
尽管如此,您通常不应该在内存管理上使用谓词控制代码。因为您不知道除了代码之外还有什么可以维护对对象的强引用,因此您无法知道释放引用将导致对象被释放。
相反,您应该将此类代码放入通知处理程序或委托(delegate)方法中,例如 -windowWillClose:
或 NSWindowWillCloseNotification
。
对于 View ,您可以覆盖 -view[Will|Did]MoveTo[Window|Superview][:]
。
如果您确实响应此类通知或方法调用并进行不可逆的清理,请务必清除相关属性,以免重复。例如,将委托(delegate)设置为nil
、删除观察者等。
关于objective-c - 当标准 NSView 或 NSWindow 被破坏时,是否有可靠的方法来破坏私有(private)数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29522715/
如果需要在类外访问静态(例如单例),可以选择公共(public)静态而不是私有(private)静态,而当不需要公开函数时首选私有(private)静态(否则未命名的命名空间就可以了)——在这种情况下
在互联网上进行了一些搜索,但找不到简单的答案。我的问题集是在 Android 框架中使用 Java,但我相信这也是标准的 Java 行为。我理解 final 和 private 的定义,它们都用于变量
我有这个代码: public final class Board { private final int[][] blocks; private final int N; pr
对我来说,过去作为 Objective-C 开发人员很简单。一个类需要公开的每个字段都是一个属性,每个私有(private)字段都是一个没有 getter 或 setter 的实例变量。但我经常看到人
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我有一个在 Docker 容器中运行的应用程序。它需要来自公司私有(private) NPM 注册表(Sinopia)的一些私有(private)模块,并且访问这些需要用户身份验证。 Dockerfi
我试图理解 C# 使用 getters 和 setters 自动声明变量与 java 声明之间的区别。 在java中我通常这样做: private int test; public int getTe
我在 Azure 中创建了 VNET。我放入了一个子集 Azure Private Link,它在 VNET 之外和另一台虚拟机中调用 Azure Function。 当我尝试通过专用 IP 调用专用
我在 Azure 中创建了 VNET。我放入了一个子集 Azure Private Link,它在 VNET 之外和另一台虚拟机中调用 Azure Function。 当我尝试通过专用 IP 调用专用
我目前正在使用 Objective-C(适用于 iPhone)构建游戏。 为此,出于性能/复杂性原因,我略微打破了 MVC,并为 View (渲染器)提供了对模型的直接引用。这是因为它应该以 60fp
我已经在 ubuntu 上成功配置了 2 个虚拟主机站点(基于名称的虚拟主机)。我的 apache 版本是 2.2.22。 这两个站点都在本地主机上工作。 /etc/hosts 条目 127.0.0.
考虑下面的类 public class A { private final Map cache; public HeavyObject getThing(); } 假设不能泄漏对缓存
我有一个类,它有一个方法,我希望它只能被它的子对象访问,而不能被这个包中的其他类访问。 Modifier | Class | Package | Subclass | World ———————
本文实例讲述了JavaScript中的公有、私有、特权和静态成员用法。分享给大家供大家参考。具体分析如下: 下面的内容是在《JavaScript.DOM高级程序设计》里面摘抄出来的,比较容易理解,
我有一个用例,我已将其简化为以下程序: public class A { private int x = 100; class B { private int y = ne
问题: 类声明如下: class Select { public: template static Iterator function(Iterator , Iterator , bo
我是一名初级 PHP 程序员。我还有很多东西要学。这就是我问这个问题的原因。在一个类中,您有一个公共(public)函数,您可以从该类外部调用它。有时你有一个私有(private)函数,你可以在私有(
问题是: 何时使用私有(private)函数,何时使用嵌套函数? (我在问 F# 但也许答案可能与其他功能语言相关) 一个小例子 namespace SomeName module BinaryRea
我发现工作表中仍然可以使用私有(private)函数。它们是隐藏的,但如果用户输入他们的名字,他们就会被调用。为什么?它应该以这种方式工作吗?有没有办法完全阻止用户定义的函数在 VBA 项目之外使用?
所以我最近开始尝试使用 Kotlin,我偶然发现了这个: If a top-level declaration is marked private, it is private to the pack
我是一名优秀的程序员,十分优秀!