问题标签 [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.
iphone - 什么是 objc_setAssociatedObject() 以及在什么情况下应该使用它?
在我接手的一个项目中,原作者选择使用它objc_setAssociatedObject()
,我不是 100% 清楚它的作用或他们决定使用它的原因。
我决定查一下,不幸的是,文档对它的用途没有很好的描述。
objc_setAssociatedObject
使用给定键和关联策略为给定对象设置关联值。
void objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy)
参数
object
关联的源对象。
key
关联的密钥。
value
与对象的键键关联的值。通过 nil 清除现有关联。
policy
协会的政策。有关可能的值,请参阅“关联对象行为”。
那么这个函数到底是做什么的,应该在什么情况下使用呢?
阅读答案后编辑
那么下面的代码有什么意义呢?
如果设备已经是实例变量,那么将设备与视图控制器关联起来有什么意义?
objective-c - Objective-C 中的 class_addMethod 只能在特定实例上工作吗?
我正在尝试编写一些动态代码,用户可以尝试从类的特定实例调用方法并在运行时解析它。检索信息的实现存在,但访问它的方法不存在,因为它是基于每个实例的。
例如,用户可能想要调用类中不存在的名为“getSomething”的方法:
在这种情况下,我希望解决一个具有可变返回类型的实现,该类型仅适用于正在处理的实例。我正在考虑使用Objective-C 中的class_addMethod,但我不能 100% 确定它的行为。在文档中,它声称这可用于添加类或实例方法。调用此类是否仅将方法添加到特定实例或类中,以便之后创建的每个实例都具有该方法?我还读到,一旦添加了方法,就无法删除它。
也许我的方法不正确,所以如果知道任何替代方案,我将不胜感激。我不能使用消息转发,因为没有类可以理解已经实现的选择器。
objective-c - 可以在 objc_SetAssociatedObject 中使用非 id 指针作为值吗?
正如标题所说。如果我这样做,不会立即出错:
是否有充分的理由谨慎使用它?
iphone - +(void)load 消息未在设备运行时发送到框架类
我已经在这里搜索了关于 SO 的问题,寻找任何关于我为什么会看到这种行为的提示,但还没有。
考虑一个类(实际上是两个表现出相同问题的类),内置在一个静态库中,包装在一个框架包中(使用的步骤)。它们继承自 Foundation 框架类集群(NSMutableDictionary
和NSMutableArray
)。
这些类的使用依赖于在静态函数(不是类方法!)用于分配和初始化实例(我猜是一种工厂辅助函数?)之前初始化的一些静态变量。
当 iOS 应用程序项目链接到该框架时,模拟器和设备之间的 Objective-C 运行时类加载行为会有所不同。
具体来说,在设备(iPhone 4、iOS 4.3.3)上,当加载应用程序时,这些类没有收到+load
消息,并且静态变量没有初始化,因此静态工厂方法失败。在模拟器上,消息被发送,并且所有工作都按预期进行。设备运行时是否有问题
我的问题是,可以对我的框架进行不同的配置以确保+load
发送消息吗?还是我在 iOS 中遇到了静态库/框架类加载的错误?
这些类来自JSONKit库 ( JKArray
, JKDictionary
)。
这里有一个说明这个问题的示例项目——https: //github.com/ohhorob/JSONKit-in-framework-demo
编辑:根据@bbum 的建议,我已经验证了JKDictionary
和JKArray
类实际上在应用程序运行时已加载并且可用。DeviceBroken
GitHub 项目上的分支已使用所使用的验证进行更新。
我向 Apple 提交了错误报告 (#9461567)。
objective-c - 获取调用方法的对象
如果我在这样的随机类中接到电话:
在里面SomeSingleton sharedInstance
,有没有办法获得对调用这个方法的对象的引用(当然没有被调用的 self 作为参数传递)?
objective-c - 使用 objc_disposeClassPair()
运行时 API 中有一个未记录的函数,它出现(基于一些玩具程序)执行其名称所暗示的功能:
但是,实际的详细信息相当薄弱。所以这更像是一组相关的问题,而不是一个问题:
- 是否有任何关于它的好文章/博客文章,或者是否有人有使用它的经验(快速谷歌建议 PyObjC 开发人员至少曾考虑过使用它)?
- 丢弃的类是否完全释放(频繁创建和删除类的应用程序会泄漏内存吗?)
- 除了通常的未记录 API 之外,还有什么值得牢记的陷阱吗?
- Apple 在哪里(/可能在)使用它?NSBundle 卸载?KVO?
objective-c - 向对象发送无法识别的选择器,为什么要终止应用程序?
在研究 Objective-C 时,它的高度动态性的后果之一是,即使它在运行时不会响应它,也可以向对象发送任何消息。
然后它将忽略该消息并引发异常。
在一个实际情况下,我试图向一个委托对象发送一条消息,该对象在委托中没有实现。
当然,我必须实现它才能拥有我的功能,但纯粹出于兴趣,我想知道为什么我的应用程序在我不这样做时会崩溃。
objective-c - 如何枚举类的方法
有没有办法枚举一个类的方法,例如,我定义了一个类,如下所示:
而且我想知道是否有任何方法可以让我使用枚举方法访问方法“doStuff1”和“doStuff2”,甚至在我知道该类有两个方法之前。
我知道方法[foo performSelector:@selector(doSutff1)]
,但这不是我想要的。
请任何人告诉我路,谢谢。
objective-c - Cocoa/Objective-C 插件冲突
我的应用程序有一个插件系统,允许我的用户编写他们自己的插件,这些插件在运行时加载。通常这很好,但在某些情况下,两个插件使用相同的库,这会导致这两者之间发生冲突。
例子:
插件 A想要使用TouchJSON来处理 JSON,因此创建者将 TouchJSON 代码添加到插件源中,它被编译并链接到插件二进制文件中。后来插件 B也想使用相同的库,并且完全相同。现在,当我的应用程序加载这两个不同的插件时,它会检测到这一点并发出如下警告:
CJSONScanner 类在 [path_to_plugin_a] 和 [path_to_plugin_b] 中都实现了。将使用两者之一。哪一个是未定义的。
由于我的应用程序只是加载插件并确保它们符合某个协议,因此我无法控制加载哪些插件以及两个或多个是否使用同一个库。
只要两个插件使用完全相同版本的库,这可能会起作用,但是一旦一个插件中的 API 发生更改,就会出现一堆问题。
对此我能做些什么吗?
objective-c - 非字母数字字符可以用作选择器吗?
以下代码编译并运行良好(注意sel_registerName("+")
):
除了“呸”之外,还有什么理由要谨慎这样做吗?