问题标签 [objective-c-runtime]
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.
objective-c - 以字符串形式获取属性名称
我需要一种方法来传递属性并获取分配给它的名称。有什么建议么?
objective-c - 如何在 Objective-c 中获取运行时块类型元数据?
我正在编写一个类,您可以在其中注册一个对象和一个要观察的属性。当属性被设置为非nil
- 时,将调用注册的回调选择器(如 target-action)。选择器可能有三个不同的签名,根据注册的类型调用正确的一个。
这很好用,但现在我想添加将块而不是选择器注册为“回调函数”的功能。是否可以找出提供的 Block 的函数签名并根据提供的 Block 的类型以不同的方式处理回调?
例如:
有任何想法吗?
我知道我可以使用特定typedef
的 'ed Block 参数创建不同的寄存器函数,但如果可能的话,我宁愿使用单个函数。
objective-c - Objective-C:关联对象行为
Objective-C 运行时参考中OBJC_ASSOCIATION_RETAIN_NONATOMIC
的关联对象行为是否在关联对象分配和保留新值之前调用关联对象引用的旧值?release
reflection - 如何使用低级运行时 API 动态创建 NSMutableArray?
介绍
所以我一直在尝试使用在Apple 文档<objc/runtime.h
中定义并遵循的 Objective-C 低级运行时 API 。你可以在这个 gist中看到我演奏的结果。
问题
我已经能够通过 Objective-C 仅通过低级运行时 API 和 C 动态创建一个简单的 Hello World(参见上面的要点)。有用。现在我正在尝试NSMutableArray
使用相同的技术动态创建一个。这是代码片段:
但这给了我一个错误:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSArray count]: method only defined for abstract class. Define -[NSMutableArray count]!'
但是,如果我将上面代码段的中间部分更改为:
这让我有点困惑,因为它们应该是等价的。第一个片段应该等同于调用[[NSMutableArray alloc] init]
作为 Objective-C 语法的调用,但不是在调用这些 C 函数时。
对此的任何启示将不胜感激。提前致谢!
objective-c - 动态添加方法
我正在尝试在Obj-c 运行时参考中找到的这种方法
我想添加一个新方法,例如:
到目前为止,我已经编写了一个 C 函数:
现在我准备好了:
但success
绝不是肯定的,我尝试过使用具有更简单签名的方法的相同方法并且它有效。所以我认为问题是最后一个参数:"v@:@:@:"
在这种情况下我应该通过什么来让我的新方法起作用?
objective-c - 在 ObjC 中捕获未定义的消息并将其转发到具有不同签名的方法
我正在用一个方法编写一个记录器类(谁没有?)
我希望能够将未定义的消息转发到此方法。例如 :
更一般地说
我看过resolveInstanceMethod
消息转发,但据我了解,他们都希望该方法具有相同的签名。
任何的想法 ?谢谢 !
objective-c - 使用 Objection 时,自定义协议的实现会因无法识别的选择器而崩溃
我正在定义一个自定义协议:
我想有不同的供应商。所以一个是 Facebook 提供商:
我设置了反对从我的班级绑定到协议。
我设置了全局注入器:
我在我的 RootViewController 中使用它,如下所示:
当我运行它时,我收到以下错误:
所以我的班级实现了协议。它已成功分配给id<NGSAuthProvider>
。我尝试[[NGSFacebookAuthProvider alloc] init]
显式构建而不是使用反对,但它仍然崩溃。
我尝试使用方法循环选择器objc/runtime.h
以查看存在哪些选择器,但它发现的唯一内容是initialize
:
这必须是我想念的简单的东西。我使用 Cocoa 定义的协议,没有这个问题。UIViewController
我已经为-based 代表定义了自定义协议,没有问题。
我很困惑为什么 Obj-C 运行时找不到我的方法!如果我更改id<NGSAuthProvider>
为NGSFacebookAuthProvider
并明确构建它,那么一切正常。
解决方案:
问题是我误解了如何绑定到协议。一种有效的方法是:
我想做的是将一个类绑定到一个协议,但 Objection 可能不知道要调用的初始化程序?
objective-c - 参数 isKindOfClass: [NSNumber class] - 理智的方法来检查这个?
所以我在玩一些直到运行时才知道 arg 的类类型的东西。像这样:
这显然是我正在尝试做的一个人为的例子。关键是这永远不会起作用,因为“arg”类总是显示为 NSCFNumber,我想不出一种方法来检查它。
有什么方法可以减少检测数组中的任意值是否为整数的混淆?
更新: 感谢@chuck、@omz 和@Nikita Leonov 的帮助。我最初在这里发布的内容只是对我遇到的问题的简化,并在没有先运行它的情况下将其写在这里。该代码一旦更新以消除错误(见下文)实际上运行良好。
我在实际代码中犯的错误同样愚蠢——我将数组传回“doWhatever”而不是数组索引处的项目,这就是我遇到问题的原因。
感谢您尝试提供帮助,但我的问题被误导了。很抱歉浪费了大家的时间!
更正了按需要运行的代码:
objective-c - Objective-C 的 @try-@catch 实现如何在运行时执行的示例?
在 Objective-C 的低级运行时标头(/usr/include/objc
)中,有一个objc-exceptions.h
文件。看起来这就是ObjC 编译器如何实现@try
/的。@catch
我正在尝试手动调用这些函数(用于 ObjC 运行时和实现的实验),以捕获“发送到类的无法识别的选择器”异常。
所以基本上,我正在寻找的只是一个如何使用低级运行时函数@try
的示例。@catch
提前致谢!
objective-c - Objective-C:检索 Class 实例的超类的首选方法
我想知道以下两种方法中哪一种是检索Class
变量超类的正确或首选方法:
Class getSuperclass(Class cls) { return [cls superclass]; }
Class getSuperclass(Class cls) { return class_getSuperclass(cls); }