NSProxy 如何“将自身转变为另一个对象”?

2024-06-24

The NSProxy 类参考 http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSProxy_Class/Reference/Reference.html说:

通常,到代理的消息被转发到真实对象或导致代理加载(或将其自身转换成)真实对象。

“变形为实物”到底是如何进行的呢?

为了让事情更具体一点,假设类Foo有一个方法newFooWithString:它接受一个字符串并返回一个新实例Foo。是否可以设置一个NSProxy坐在周围,如果一个pleaseBecomeAFooUsingString: @"bar"消息被接收,将其自身转换为[Foo newFooWithString: @"bar"],占用相同的内存,而不干扰可能存在的其他对其自身的引用?


如果您在整个代码中都有一个指向同一个 NSProxy 实例的指针,并且将“转换”它,那么它将在整个代码中发生变化。无法区分对象方法的调用者,因此您将无法自动替换代码中转发方法调用的目标。常见的可转换代理将如下所示:

MyTrickyProxy.h

#import <Foundation/Foundation.h>

@interface MyTrickyProxy : NSProxy {
    NSObject *object;
}

- (id)transformToObject:(NSObject *)anObject;

@end

MyTrickyProxy.m

#import "MyTrickyProxy.h"

@implementation MyTrickyProxy

- (void)dealloc 
{
    [object release];
    object = nil;

    [super dealloc];
}

- (NSString *)description 
{
    return [object description];
}

//Stupid transform implementation just by assigning a passed in object as transformation target. You can write your factory here and use passed in object as id for object that need ot be created.
- (id)transformToObject:(NSObject *)anObject 
{
    if(object != anObject) {
        [object release];
    }
    object = [anObject retain];

    return object;
}

- (void)forwardInvocation:(NSInvocation *)invocation 
{
    if (object != nil) {
        [invocation setTarget:object];    
        [invocation invoke];
    }
}

- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel 
{
    NSMethodSignature *result;
    if (object != nil) {
        result = [object methodSignatureForSelector:sel];
    } else {
        //Will throw an exception as default implementation
        result = [super methodSignatureForSelector:sel];
    }

    return result;
}

@end

所以你要求的是某种代码魔法,但 NSProxy 是一个简单的消息转发器,根本没有任何魔法,所以你的目标无法以你所描述的方式实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NSProxy 如何“将自身转变为另一个对象”? 的相关文章

随机推荐

  • Windows 服务的 Log4net

    这是我第一次使用Log4net 它没有显示任何错误 但没有写入文件 我在我的中添加了以下内容AppConfig file
  • 如何将文件包含在 php 中后排除它?

    我们在里面添加一个文件之后Myfile php with require once abc php or include once abc php 我们将如何删除该文件 或者如何停止abc php在特定代码块之后访问文件内容 在 PHP 中
  • RtaskscheduleR不执行脚本

    我正在尝试使用每分钟运行一次脚本taskscheduleR图书馆 我按照 GitHub 页面上的示例进行操作 但遇到了以下问题 R 表示任务已创建 但脚本未正确执行 它应该以附加模式将数据写入文件 有问题的文件已存在 我没有看到任何日志文件
  • QSettings - ini 文件的位置在哪里?

    我在用着QSettings在 Windows 中将一些数据存储为 ini 文件 我想查看ini文件 但我不知道ini文件的位置在哪里 这是我的代码 QSettings set new QSettings QSettings IniForma
  • 维基百科 API 搜索标题生成器

    尝试使用生成器通过 api 搜索图块 我注意到有两种可能的生成器 但我都遇到了问题 前缀搜索 如果我有多个单词并且查询中的顺序相反 例如 brian adams 将返回答案 但 adams brian 则不会 则效果不佳 搜索 似乎不允许按
  • RapidXML 打印标头具有未定义的方法

    我一直在我的一个项目中使用 RapidXML 一切都很顺利 直到我决定使用它来编写 xml 我的代码或多或少如下 attempt to open the file for writing std ofstream file fileName
  • 如何对相同值的范围进行二分查找?

    我有一个已排序的数字列表 我需要让它返回该数字出现的索引范围 我的清单是 daysSick 0 0 0 0 1 2 3 3 3 4 5 5 5 6 6 11 15 24 如果我搜索 0 我需要返回 0 3 现在我只能找到一个数字的位置 我知
  • 具有 ISO 日期格式的 WCF REST JSON

    我在 WCF Web 服务 框架 4 0 中使用 JSON 支持 ISO 日期格式时遇到了一个大问题 我尝试了很多 但还没有运气 休息服务 WebInvoke Method PUT UriTemplate mvnoid OrderID Re
  • WPF 找不到某些字体

    为什么会这样Media Fonts找不到 Arial Rounded MT Bold foreach var f in System Windows Media Fonts SystemFontFamilies if f Source Ar
  • VS2013 - 如何使用外部程序在 C# 项目的命令行参数中传递解决方案文件夹 $(SolutionDir)

    我正在为 Excel 构建一个 C 添加 为了调试它 我需要使用包含插件的调试或发布路径的命令行参数启动 Excel exe 例如 启动外部程序 C Program Files Microsoft Office Office15 EXCEL
  • 在python中缓存数据库数据

    在项目中 我需要缓存从每个请求获取的数据库数据 这样从下次开始 将从缓存而不是数据库中选取数据 表行 从而提高性能 在数据库中 我有超过 10M 的数据行 我正在浏览烧杯缓存文档 从中看来它只会将函数和参数一起缓存为键 那么这如何存储我的主
  • JFreeChart:如何更改XYPlot前景色?

    JFreeChart XYPlot 背景颜色更改为setBackgroundPaint 但好像没有对应的setForegroundPaint XYPlot plot XYPlot chart getPlot plot setBackgrou
  • 如何向heroku节点服务器添加python依赖项?

    我有一个运行 Node 的 Heroku 应用程序 但我需要能够在此服务器上运行 Python 脚本 我正在尝试安装我的 Python 依赖项 但无法让它工作 我已将 python 和节点构建包添加到我的项目中 我已创建虚拟环境并成功安装了
  • .Net 中的 Midi 实现

    有人对在 C Winforms 中编写基于 MIDI 的应用程序有任何指导或建议吗 我最近购买了一个新的效果踏板 它具有完整的 MIDI 实现 或者我相信 但制造商认为不发布图书馆员 补丁编辑应用程序是合适的 除了将键盘插入另一个 MIDI
  • 启动包中没有指定postgresql用户名

    public class HelloPostgreSQLActivity extends Activity TextView resultArea Override public void onCreate Bundle savedInst
  • Erlang:远程调用与发送消息

    我想在远程节点上执行一些过程 我不确定哪种方法是最好的方法 我可以写一个rpc call去做这个 或通过以下方式发送消息Remote call some procedure 到节点来启动程序并使用receive等待回复 那么erlang中哪
  • 将数据从 Django 传递到 D3

    我正在尝试使用 Django 和 D3 js 编写一个非常基本的条形图 我有一个名为 play 的对象 其中包含一个名为 date 的日期时间字段 我想要做的是显示一段时间内按月分组的播放次数 基本上我有两个问题 如何将这些内容按月分组并统
  • 应用程序在后台时如何处理 iOS 远程通知

    我正在通过苹果推送通知开发iOS推送通知功能 现在当我的应用程序处于后台或前台时我收到了正确的通知 但我想当我的应用程序处于后台时基本上当我的应用程序处于后台时处理远程通知只是显示来自有效负载的警报消息 实际上我只是想自定义我的远程通知 c
  • 亚马逊网络服务工作示例

    我进行了各种搜索 尝试让产品广告 API 正常工作 我尝试了来自这些论坛和互联网的许多示例 但它不起作用 有人讨论过修改 WSDL 但这也不起作用 这是我去过的地方 https affiliate program amazon com gp
  • NSProxy 如何“将自身转变为另一个对象”?

    The NSProxy 类参考 http developer apple com library mac documentation Cocoa Reference Foundation Classes NSProxy Class Refe