gpt4 book ai didi

Objective-C,我怎样才能在另一个类中连接一个方法

转载 作者:搜寻专家 更新时间:2023-10-30 19:59:03 24 4
gpt4 key购买 nike

Objective-C 将它的所有方法保存在一个巨大的哈希表中——所以难道不应该修补这个表并用我自己的修补方法(然后调用原始方法)替换现有方法吗?

我需要一种方法来连接窗口中的 NSWindow KeyUp 方法,我无法对其进行子类化,因为它已经创建。

我需要一些代码或至少一些可用于进一步搜索的关键字。

最佳答案

你不应该为此调配方法。这是不赞成的行为。这将影响您应用程序中的所有窗口,而不仅仅是您想要更改的窗口。但是,您应该做的是已经将 NSWindow 子类化,然后在运行时更改该窗口的类。这可以使用这个运行时函数来完成:

Class object_setClass(id object, Class cls)

引用在这里:http://developer.apple.com/mac/library/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html#//apple_ref/doc/uid/TP40001418-CH1g-SW12

您的代码应该如下所示:

object_setClass(theWindow, [MyWindowSubclass class]);

可能遇到的问题是窗口已经是 NSWindow 的子类。如果是这种情况,则有更复杂的方法可以实现这一目标。您可以在运行时动态构造一个类。这是更多代码。鉴于该窗口是目标窗口:

Class newWindowClass = objc_allocateClassPair([window class], "MyHackyWindowSubclass", 0);
Method upMethod = class_getInstanceMethod(newWindowClass, @selector(keyUp:));
method_setImplementation(upMethod, new_NSWindow_keyUp_);
object_setClass(window, newWindowClass);

我不完全确定这不会改变父类(super class)的实现。该文档对此有点不明确。但是,您仍然应该尝试一下。如果不行,将第二行和第三行替换为这一行:

class_replaceMethod(newWindowClass, @selector(keyUp:), new_NSWindow_keyUp_, "v@:@");

在任何情况下,您都需要定义新的方法实现。它可能看起来像那样(部分由 KennyTM 提供):

void new_NSWindow_keyUp_(NSWindow* self, SEL _cmd, NSEvent* evt) {
[super keyUp: evt];
... // do your changes
}

关于Objective-C,我怎样才能在另一个类中连接一个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3429891/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com