问题标签 [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.

0 投票
4 回答
27750 浏览

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
协会的政策。有关可能的值,请参阅“关联对象行为”。

那么这个函数到底是做什么的,应该在什么情况下使用呢?


阅读答案后编辑

那么下面的代码有什么意义呢?

如果设备已经是实例变量,那么将设​​备与视图控制器关联起来有什么意义?

0 投票
3 回答
5882 浏览

objective-c - Objective-C 中的 class_addMethod 只能在特定实例上工作吗?

我正在尝试编写一些动态代码,用户可以尝试从类的特定实例调用方法并在运行时解析它。检索信息的实现存在,但访问它的方法不存在,因为它是基于每个实例的。

例如,用户可能想要调用类中不存在的名为“getSomething”的方法:

在这种情况下,我希望解决一个具有可变返回类型的实现,该类型仅适用于正在处理的实例。我正在考虑使用Objective-C 中的class_addMethod,但我不能 100% 确定它的行为。在文档中,它声称这可用于添加类或实例方法。调用此类是否仅将方法添加到特定实例或类中,以便之后创建的每个实例都具有该方法?我还读到,一旦添加了方法,就无法删除它。

也许我的方法不正确,所以如果知道任何替代方案,我将不胜感激。我不能使用消息转发,因为没有类可以理解已经实现的选择器。

0 投票
2 回答
445 浏览

objective-c - 可以在 objc_SetAssociatedObject 中使用非 id 指针作为值吗?

正如标题所说。如果我这样做,不会立即出错:

是否有充分的理由谨慎使用它?

0 投票
2 回答
1573 浏览

iphone - +(void)load 消息未在设备运行时发送到框架类

我已经在这里搜索了关于 SO 的问题,寻找任何关于我为什么会看到这种行为的提示,但还没有。


考虑一个类(实际上是两个表现出相同问题的类),内置在一个静态库中,包装在一个框架包中(使用的步骤)。它们继承自 Foundation 框架类集群(NSMutableDictionaryNSMutableArray)。

这些类的使用依赖于在静态函数(不是类方法!)用于分配和初始化实例(我猜是一种工厂辅助函数?)之前初始化的一些静态变量。

当 iOS 应用程序项目链接到该框架时,模拟器和设备之间的 Objective-C 运行时类加载行为会有所不同。

具体来说,在设备(iPhone 4、iOS 4.3.3)上,当加载应用程序时,这些类没有收到+load消息,并且静态变量没有初始化,因此静态工厂方法失败。在模拟器上,消息被发送,并且所有工作都按预期进行。设备运行时是否有问题

我的问题是,可以对我的框架进行不同的配置以确保+load发送消息吗?还是我在 iOS 中遇到了静态库/框架类加载的错误?


这些类来自JSONKit库 ( JKArray, JKDictionary)。

这里有一个说明这个问题的示例项目——https: //github.com/ohhorob/JSONKit-in-framework-demo


编辑:根据@bbum 的建议,我已经验证了JKDictionaryJKArray类实际上在应用程序运行时已加载并且可用。DeviceBrokenGitHub 项目上的分支已使用所使用的验证进行更新。

我向 Apple 提交了错误报告 (#9461567)。

0 投票
1 回答
1092 浏览

objective-c - 获取调用方法的对象

如果我在这样的随机类中接到电话:

在里面SomeSingleton sharedInstance,有没有办法获得对调用这个方法的对象的引用(当然没有被调用的 self 作为参数传递)?

0 投票
1 回答
556 浏览

objective-c - 使用 objc_disposeClassPair()

运行时 API 中有一个未记录的函数,它出现(基于一些玩具程序)执行其名称所暗示的功能:

但是,实际的详细信息相当薄弱。所以这更像是一组相关的问题,而不是一个问题:

  • 是否有任何关于它的好文章/博客文章,或者是否有人有使用它的经验(快速谷歌建议 PyObjC 开发人员至少曾考虑过使用它)?
  • 丢弃的类是否完全释放(频繁创建和删除类的应用程序会泄漏内存吗?)
  • 除了通常的未记录 API 之外,还有什么值得牢记的陷阱吗?
  • Apple 在哪里(/可能在)使用它?NSBundle 卸载?KVO?
0 投票
5 回答
1032 浏览

objective-c - 向对象发送无法识别的选择器,为什么要终止应用程序?

在研究 Objective-C 时,它的高度动态性的后果之一是,即使它在运行时不会响应它,也可以向对象发送任何消息。

然后它将忽略该消息并引发异常。

在一个实际情况下,我试图向一个委托对象发送一条消息,该对象在委托中没有实现。

当然,我必须实现它才能拥有我的功能,但纯粹出于兴趣,我想知道为什么我的应用程序在我不这样做时会崩溃。

0 投票
1 回答
158 浏览

objective-c - 如何枚举类的方法

有没有办法枚举一个类的方法,例如,我定义了一个类,如下所示:

而且我想知道是否有任何方法可以让我使用枚举方法访问方法“doStuff1”和“doStuff2”,甚至在我知道该类有两个方法之前。

我知道方法[foo performSelector:@selector(doSutff1)],但这不是我想要的。
请任何人告诉我路,谢谢。

0 投票
2 回答
186 浏览

objective-c - Cocoa/Objective-C 插件冲突

我的应用程序有一个插件系统,允许我的用户编写他们自己的插件,这些插件在运行时加载。通常这很好,但在某些情况下,两个插件使用相同的库,这会导致这两者之间发生冲突。

例子:

插件 A想要使用TouchJSON来处理 JSON,因此创建者将 TouchJSON 代码添加到插件源中,它被编译并链接到插件二进制文件中。后来插件 B也想使用相同的库,并且完全相同。现在,当我的应用程序加载这两个不同的插件时,它会检测到这一点并发出如下警告:

CJSONScanner 类在 [path_to_plugin_a] 和 [path_to_plugin_b] 中都实现了。将使用两者之一。哪一个是未定义的。

由于我的应用程序只是加载插件并确保它们符合某个协议,因此我无法控制加载哪些插件以及两个或多个是否使用同一个库。

只要两个插件使用完全相同版本的库,这可能会起作用,但是一旦一个插件中的 API 发生更改,就会出现一堆问题。

对此我能做些什么吗?

0 投票
2 回答
191 浏览

objective-c - 非字母数字字符可以用作选择器吗?

以下代码编译并运行良好(注意sel_registerName("+")):

除了“呸”之外,还有什么理由要谨慎这样做吗?