问题标签 [nsproxy]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
576 浏览

objective-c - 禁用未找到实例方法警告

我目前正在研究一个NSProxy子类,它拦截某些消息并且从不将它们转发给任何人,而只是处理它们,所以这些方法永远不会真正存在。问题来了,显然编译器开始抱怨缺少方法实现,我不知道如何停止它,向接口添加存根方法只是为了让编译器关闭是行不通的,因为方法是任意形成的,我不知道它们(为了使其更具体,我要求这个项目)。

理想情况下,我想告诉编译器它根本不应该对这个特定的类进行任何方法检查,但由于这似乎不太可能,我也会为一种#pragma或任何其他方式感到高兴(其中不包括关闭为整个项目/文件中的每个警告编译器!)

0 投票
1 回答
1056 浏览

objective-c - NSProxy with forwardInvocation with self - 可能吗?

我已经设置了 NSProxy、forwardInvocation 等来捕获传递给对象的消息 - 一切正常。

我还想做的是捕获 self 传递的消息,例如: [self doSomething] 或 self.myVal = 5;

它似乎不起作用......这可能吗?

0 投票
2 回答
4670 浏览

objective-c - NSProxy 类有用的真实例子,为什么?

我一直想知道为什么 NSProxy 类如此重要。为什么一个对象需要将其实例变量保存在其他对象中?我需要示例来了解何时使用它。谢谢!

0 投票
1 回答
144 浏览

objective-c - 我的代理类的内部调用不会通过代理路由

我正在使用方法调配将所有方法调用包装在一个具有一些额外功能的类中。具体来说,我是:

  • 检查此方法调用所需的对象是否在缓存中
  • 如果缓存有该对象返回它。
  • 如果没有,则分派到原始实现,填充缓存并返回。

我想看看使用 NSProxy 是否提供了更具可读性的代码,并且认为 NSProxy 可能会使重定向具有未知数量参数的方法调用变得容易。

因此,NSProxy 版本运行良好,除了一个重要问题。我的子类的任何内部调用都不会通过代理。

以下是我创建替代拦截器的方法:

内部调用(即在代理类中调用“self”)不会通过代理路由:

现在,在我的代理类的子类中,我有代码希望内部调用通过代理进行。但他们没有。

问题:

什么是通过代理让这些内部去的简单方法?

0 投票
2 回答
249 浏览

ios - 如何在没有 performSelector: 的情况下发送未声明的选择器?

背景:BackendClient我有一个代表与服务器连接 的对象(我们称之为)。它的方法生成为单个@protocol并且它们都是同步的,所以我想创建将在后台调用它们的代理对象。主要问题是返回值,我显然不能从异步方法返回,所以我需要传递一个回调。“简单”的方法是复制 allBackendClient的方法并添加回调参数。但这不是解决该问题的动态方式,而 ObjectiveC 的本质是动态的。那就是performSelector:出现的地方。它完全解决了问题,但它几乎扼杀了代理对象的透明度。

问题: 我希望能够将未声明的选择器发送到代理(的子类NSProxy)对象,就好像它已经声明过一样。例如,我有方法:

BackendClient协议中。我希望代理调用看起来像这样:

但这不会编译,因为

'BackendClientProxy' 没有可见的@interface 声明选择器'authByRequest:withCallBack:'

好的。让我们稍微冷静一下编译器:

哇。另一个错误:

选择器“authByRequest:withCallBack:”没有已知的实例方法

我想到的唯一一件事就是@protocol在运行时以某种方式使用所需的方法构造新的,但我不知道该怎么做。

结论:我需要抑制这个编译错误。知道怎么做吗?

0 投票
1 回答
641 浏览

ios - NSProxy 和 forwardInvocation:在块内调用的调用导致 nil 返回值

我正在使用一个NSProxy子类并forwardInvocation:用于捕获对我的后端 API 对象(共享实例)的调用。

一些背景信息:我想捕获 API 调用,以便每次我都可以检查是否必须刷新我的身份验证令牌。如果是,我只是在之前执行刷新。

方法参数 (of invocation) 包含块。

一些简化的代码:

我已经在调用retainArguments,所以我的块和其他参数不会因为invokeWithTarget:refreshWithBlock:进行异步 API 调用)的延迟执行而丢失。

到目前为止一切正常 - 但是:

调用的返回值始终是在刷新块内执行nil时。invokeWithTarget:有没有办法保留返回值(如参数)?

有什么提示吗?建议?


更新

作为对@quellish 的回应:问题是返回值是NSURLSessionDataTask我在调用后直接读取的类型(我用来显示活动指示器)。但是代理不会立即转发呼叫,因此返回值不存在 - 当然(我是盲目的)。什么是可能的解决方法?我可以返回占位符值吗?或者当方法被调用时我如何知道调用者,以便稍后检索返回值?

0 投票
1 回答
1246 浏览

objective-c - NSProxy 伪装成 Class 在 64 位运行时不处理 respondsToSelector

在 OCMockito 中,测试替身是使用 NSProxy 实现的。双重替补实例的实现-respondsToSelector:方式如下:

但是一个的双重代表-respondsToSelector:是这样的:

这一切都适用于 32 位运行时。例如,如果_mockedClass[NSString class],代理正确回答它响应选择器+pathWithComponents:

但在 64 位运行时,它会崩溃:

请注意,它正在调用class_respondsToSelector(…). 我怀疑我被运行时的优化所困扰。我能做些什么来解决这个问题?

0 投票
1 回答
512 浏览

ios - iOS:NSProxy 不能挂钩在类本身内部调用的方法

我使用 NSProxy 来模拟一个类,并希望挂钩该类的所有调用。但是只有类外调用的方法才被钩住,类内没有调用的方法。下面是我的代码:

在我的AppDelegate.m中,TBClassMockNSProxy的子类

在我的TBTestClass.m

在我的TBClassMock.m

然后我可以记录 的调用[foo outsideCalled],但不能记录 的调用[self insideCalled]

我的目标是在类的所有调用中做一些事情//... Do other things,这种方式似乎失败了。关于这个和任何其他方法来实现我的要求的任何解释?我只是不想使用这个类的所有方法,method_exchangeImplementations因为我认为这太挑剔而且不是一个好方法。

0 投票
1 回答
929 浏览

cocoa - 如何在没有代理对象的情况下从 NSArrayController 获取选定的对象?

我正在尝试在NSTableViewNSArrayController. 我的copy:方法如下所示:

当我尝试执行复制时,访问控制器的选择时出错,因为它返回一个代理对象:

如何获得实际选定的对象?

0 投票
1 回答
3376 浏览

ios - iOS 中的代理模式 - Swift

我需要使用 swift 在 iOS 中创建代理模式

我已经使用Objective C尝试过,这里是代码

我的协议.h

测试BO.h

测试BO.m

测试代理处理程序.h

测试代理处理程序.m

我已经调用它使用

但我无法让它在 Swift 中工作,即使初始化程序显示消息

TestHandler.swift

有没有人有任何线索可以迅速做到这一点?

编辑:

java中,您可以使用Proxy.newProxyInstance调用创建方法的运行时实现,但这可以在 iOS 中实现吗?使用迅速?有什么线索吗?