objective-c - NSInspiration setArgument 问题

标签 objective-c pointers nsinvocation

我需要使用 NSInitation 动态调用方法。 这是我尝试过的:

NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[[messageRecord.senderController class] instanceMethodSignatureForSelector:messageRecord.receiverAction]];

[invocation setSelector:messageRecord.receiverAction];
[invocation setTarget: messageRecord.senderController];
[invocation setArgument: &(message.data) atIndex:2];
[invocation invoke];

我需要提一下,messageRecord.senderController 是要调用哪个方法的对象,messageRecord.receiverAction 是给这段代码的选择器。此外,message.data 是一个 (NSArray *) 类型的对象,并且已正确初始化。

这段代码给出了以下编译时错误

Address of property expression requested

当我按如下方式更改调用过程时,它按预期工作:

NSArray *dataArray = message.data;

[invocation setSelector:messageRecord.receiverAction];
[invocation setTarget: messageRecord.senderController];
[invocation setArgument: &dataArray atIndex:2];
[invocation invoke];

两者之间的唯一区别是:我创建了一个本地 NSArray 指针并将 message.data 分配给它。后来,给出了新创建的指针的地址,而不是 message.data 本身。

为什么它有效?到底有什么区别?

最佳答案

正如 Shimanski Ahem 提到的,属性(property)不是有地址的东西。属性只是一对 getter 和 setter 方法。就是这样。 getter 和 setter 方法可以由您提供,也可以由编译器基于某些实例变量合成。如果它们是由您提供的,它们也可以基于某些实例变量,但您需要执行一些额外的逻辑;或者他们可以根据其他事物完全动态地生成值。因此,某处可能不存在与该属性相对应的“实例变量”。

如果 getter 和 setter 是综合的,并且您知道它们所基于的实例​​变量(您可以从综合声明中获取该实例变量;如果综合没有显式指定,则该变量与属性名称相同;或者如果在最近版本的编译器中省略并隐式指定合成,则为 _data (前面有下划线)。这就是 Shimanski Artem 所显示的内容。

但是,退一步问一下,为什么首先需要一个指向该值的指针?什么目的?如果您使用指向原始值的指针或指向该值的副本的指针,会有什么不同吗?了解 setArgument: 方法的工作原理以及它为何需要指针将帮助您回答其中的许多问题。 setArgument: 允许您使用您选择的值设置调用中的参数之一,因此它确实关心。那么为什么不直接传递值呢?那么,它会是什么类型呢?不同的类型在 C 中具有不同的大小,所以这是不可能的。因此,它要求您提供指向该值的指针(适用于任何类型),然后从那里复制它。所以它只关心指向的,而不是特定的地址。这就是为什么(正如您所观察到的),当您想要将 setArgument: 与不可寻址的内容(例如属性,或更复杂的表达式,或 Objective 中的 this )一起使用时-C++ 等),您可以简单地将其分配给临时变量并获取其地址。

关于objective-c - NSInspiration setArgument 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13601902/

相关文章:

ios - 当工作区中有多个 xcode 项目时,如何将 cocoapods cordova 插件 src 链接到 .framework 头文件?

c - 使用 free 理解 malloc 和指针递增

iphone - 使用 NSIncation 在主线程上执行选择器

ios - NSInvocation 返回值但使用 EXC_BAD_ACCESS 使应用程序崩溃

objective-c - 使用 NSString drawAtPoint : 时,平滑看起来与系统不同

iphone - 如何为 UITableView 创建详细 View 以允许我编辑 Core Data 中的数据?

objective-c - 从 NSImage 获取 GLuint 纹理

在 C 中正确使用 free() 函数

c - 算术运算符如何处理 c 中的地址?

ios - methodSignatureForSelector 和 instanceMethodSignatureForSelector 有什么区别?