问题标签 [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 投票
3 回答
4942 浏览

objective-c - 现代 Objective C 运行时中 ivar 合成的底层机制是什么

现代(64 位 OS X 和 iPhone OS)Objective C 运行时的特性之一是属性能够动态合成 ivars 而无需在类中显式声明它们:

在相当多的代码中,我使用自定义 getter 实现来初始化属性:

上面的内容与合成的 ivar 不兼容,因为它需要访问一个未在标头中声明的 ivar。由于各种原因,我想更新我的一些个人框架以在现代运行时使用合成 ivars,需要修改上述代码以使用合成 ivars 以实现该目标。

虽然 Objective C 2.0 文档声明现代运行时上的合成访问器将在首次使用时合成 ivar。它没有指定使用什么低级机制来执行此操作。是否由 class_getInstanceVariable() 完成,对 class_addIvar() 的限制是否松动,是否是目标 C 2.0 运行时中的未记录函数?虽然我可以为支持我的属性的数据实现自己的侧存储,但我更愿意使用合成访问器正在使用的机制。

0 投票
3 回答
1375 浏览

c - 如何将基于 C 的语言添加到 GCC

如果我想修改或添加我自己的 C 扩展,并将它们添加到 GCC C 编译器,我需要做什么?我不想提议对语言进行更改,我想知道 C 编译器实际上是如何工作的。

我查看了 GCC 的源代码,它看起来好像 Objective-C 被实现为一个简单的解析器,它生成引用修改后的运行时库的代码,然后对于基于 C 的所有内容,它使用常规C 编译器。我没有深入研究它,所以我可能不在正确的轨道上。

例如,我想在 Objective-C 中添加我自己的关键字,只是为了好玩。我想添加一些看起来很容易实现的东西,比如也许@assert. 我想要的只是@assert调用一个我将添加到 Objective-C 运行时的函数:

显然,无论如何我都可以将其实现为函数调用和宏,但我想了解 C 源代码的解析和编译阶段,也许我可以将自己的扩展添加到语言中以供自己使用。

我看过的源代码一直是指“树”,并且有很多很多宏可以执行操作或从这些树中获取信息。

是否有任何文档可以深入解释这类事情?

0 投票
2 回答
5878 浏览

cocoa-touch - 使用 [[[UIApplication sharedApplication] delegate] myClass Property] 时编译器警告“未在协议中找到”?

我有 myClass 由我的 appDelegate 实例化,我有另一个类 newClass 由 myClass 实例化。从 newClass 实例中,我想访问创建它的 myClass 实例中的属性。我通过以下方式做到了这一点:

这行得通,我实际上可以获得该属性,但我从 Xcode 收到此警告:

newClass 属性已在 .h 和 .m 文件中正确声明,它的属性已设置并已合成。

它编译并运行,我实际上可以获得属性的值。

我应该忽略 Xcode 中的警告吗?

有没有更好的方法来访问 myClass 实例的属性?

0 投票
4 回答
4256 浏览

iphone - 用于通用 NSCoding 实现的 Objective-C 反射

在 Objective-C 中是否有任何反射方法允许您通过检查对象的公共属性并生成 encodeWithCoder: 和 initWithCoder: 的通用实现来编写通用的 NSCoding 实现。

我正在考虑像XStream for Java 这样的东西,它允许使用反射来序列化和反序列化 Java 对象的通用方法。更好的方法可能是将属性标记为您想要序列化或瞬态的事物(如 Java 中的瞬态关键字)。

我一直在阅读有关Cocoa的Archives and Serializations Programming Guide的文档。我知道您希望对对象的序列化进行一些控制,但这通常是一个对称的过程,必须反转为序列化编码的内容以反序列化它似乎很奇怪。我是 DRY 的信徒(不要重复自己)。

0 投票
5 回答
1561 浏览

objective-c - 在 Modern Runtime 中使用实例变量

我在 Obj-c 和 Cocoa 方面有几年的经验,但我现在才刚刚回到它以及 Obj-C 2.0 等的进步。

我试图了解现代运行时和声明属性等。让我有点困惑的一件事是现代运行时中隐式创建 iVar 的能力。当然,这意味着在您的代码中,您应该始终使用 self.property 来访问该值。

但是,在 init* 和 dealloc(假设您没有使用 GC)方法中,我们应该直接使用 iVar(在当前运行时)。

所以问题是:

  1. 我们应该在 init* 中使用属性访问器并在 Modern Runtime 中使用 dealloc 吗?

  2. 如果是这样,为什么会有所不同?仅仅是因为编译器看不到 iVar 吗?

  3. 如果我需要覆盖访问器,我是否仍然可以访问将在运行时定义的 iVar,还是必须定义运行时将使用的实际 iVar?

  4. 同样,如果我可以访问合成的 iVar,为什么我不能继续为 init* 和 dealloc 方法执行此操作?

我多次阅读文档,但它们似乎对所有这些都有些模糊,我想确保我理解它,以便决定如何继续编码。

希望我的问题很清楚。


测试快速总结

  1. 如果您不在 legacy 中声明 ivar,编译器将完全不高兴

  2. 如果您#ifndef __OBJC2__在遗留编译器中使用 around ivar 很高兴,您可以直接使用 ivar 和作为属性

  3. 在现代运行时,您可以保留 ivar 未定义并作为属性访问

  4. 在现代运行时,尝试直接访问 ivar 而不声明会在编译期间出错

  5. @private当然,ivar 的声明允许直接访问 ivar,无论是传统的还是现代的

现在真的没有给出一个干净的前进方式吗?

0 投票
2 回答
1075 浏览

iphone - NSObjCMessageLoggingEnabled 与 iPhone 3.0

我正在调试一个为 iPhone OS 2.2.1 编写的程序,并且必须为 3.0 稍微重写。拥有所有正在进行的 Objective-C 消息调用的列表,包括“幕后”调用,将非常有用。

我在一个网站上找到了 NSObjCMessageLoggingEnabled,但不确定它是否适用于 iPhone。有谁知道这是否/如何工作,如果没有,是否有另一种方法可以实现相同的目标?

谢谢!

0 投票
2 回答
783 浏览

objective-c - Objective-C 运行时中的类似 IBOutlet 的构造

我对 IBOutlets 的理解是它们充当了 Objective-C 类中 ivars 和属性的标记。Objective-C 运行时中是否有任何东西可以让人们在运行时查询 ivar 或属性或类是否已用 IBOutlet 标记?或者 XCode 只是在编译时对这些做了一些聪明的事情?

如果它们是运行时构造,是否可以定义自己的标记并以这种方式使用它们:

0 投票
3 回答
9006 浏览

objective-c - 如何在 Objective-C 中列出对象的所有字段?

如果我有一个类,如何列出它的所有实例变量名称?

例如:

我想获得“myInt”、“myString”和“myArray”。有什么方法可以得到一组我可以迭代的名字吗?

我尝试搜索 Objective-C 文档,但找不到任何东西(我也不确定这叫什么)。

0 投票
2 回答
2311 浏览

objective-c - 处理 object_getIvar(id object, Ivar ivar) 的返回值

1) object_getIvar(id object, Ivar ivar) 如果 Ivar 是一个对象,则返回一个“id”,例如。如果变量是 NSString,大概是 id = NSString 包含该值。那是对的吗?或者我需要做什么才能访问 Ivar 的值。

2)如果 Ivar 是浮点数/整数等,将返回什么以及如何将其转换为我可以使用的东西(浮点数或整数很好,因为我可以使用 NSNumber numberWithXXX 将其转换为对象)。

0 投票
5 回答
5436 浏览

objective-c - 如何从 object_getIvar(self, myIntVar) 返回指针时获取 int 值

如果 object_getIvar 中的变量是基本数据类型(例如,float、int、bool),当函数根据文档返回指针(id)时,我如何获取该值。我尝试转换为 int, int* 但是当我尝试将其转换为 NSLog 时,我收到有关不兼容指针类型的错误。