- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
每次我重新开始理解 Objective-C 运行时,我的大脑都会变得困惑。据我所知(通过阅读一些很棒的文章,如 Metaclasses , Obj-C Runtime )Objective-C 类实际上是类对象,例如NSString 本身是其根元类的对象。此外,它所谓的ivar“isa”指针保留了所有基本细节,如父类(super class)、方法列表、名称等。下面是仅基于该理论的一些问题-
(1)。检查 objc/runtime.h 的当前声明,您会发现以下结构声明:
struct objc_class {
Class isa OBJC_ISA_AVAILABILITY;
> #if !__OBJC2__
Class super_class OBJC2_UNAVAILABLE;
const char *name OBJC2_UNAVAILABLE;
long version OBJC2_UNAVAILABLE;
long info OBJC2_UNAVAILABLE;
long instance_size OBJC2_UNAVAILABLE;
struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;
struct objc_method_list **methodLists OBJC2_UNAVAILABLE;
struct objc_cache *cache OBJC2_UNAVAILABLE;
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;
>
> **#endif**
} OBJC2_UNAVAILABLE;
我希望这意味着从 Objective-C 2.0 开始,这个结构中所有可用的是“isa”指针。这似乎使该运行时理论的所有逻辑都消失了。这些详细信息(如父类(super class)、方法列表等)现在存储在哪里?
(2)。从技术上讲,isa 是指向结构 objc_class 的指针,它本身有 isa 作为其成员。所以当我尝试访问时(例如在 AppDelegate 中):
NSLog(@"class isa ptr %@", isa->isa);
或
NSLog(@"class isa %@", ((Class)[NSString class])->name);
我收到一个编译时错误:
为什么?我认为这是访问结构成员的正确语法
(3)。使用 NSLog 在控制台上打印“类”(我指的是 typedef struct objc_class *Class
)对象会显示 Objective-C 类的名称。
NSLog(@"NSObject class %@", [NSObject class]);
怎么会这样? class 是返回“Class”对象的类方法。如果要打印类名,应该这样打印:
NSLog(@"NSObject class %@", ((Class)[NSObject class])->name);
帮我找出我遗漏了什么。
最佳答案
在 ObjC 2.0 中,所有类细节都是私有(private)实现细节。也许数据布局实际上保持不变,也许不是。
name
?您引用的头文件说在 ObjC 2.0 中只有 isa
指针在那里,所有其他的东西都消失了。
NSLog
打印[NSString class]
为NSString
?因为 NSLog
,像 -[NSString stringWithFormat:]
调用提供的对象上的 description
方法。显然,+[Class description]
方法返回类的名称。
关于ios - 头脑 Storm Objective-C 运行时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23251542/
下面的代码是插入排序的标准算法。 但是玩弄它让我大开眼界,发现了一些我无法全神贯注的东西。非常感谢任何帮助。 如果我们在这一行中用值 arr[i] 替换变量“Key” if (key = 0) {
我有 30 个未开封的 Lego Mindstorms 套件,我很想在我的编程入门类(class)中使用它们,以便在年底时做一些简单的机器人技术。我们在类里面使用 Python,所以我希望有一种方法可
我创建了一个数据库。一切似乎都是为了开始填充它,但每次我尝试调试我的项目时,它都会把这个错误扔到我面前: "error: C1083: Cannot open include file: 'QtSql
我正在尝试找出 SQL 数据库的表/字段的最佳组织方式。 让我解释一下该产品的功能。我的组织每周安排 5 天的志愿者服务,每天的不同时间。我正在制作一个程序,允许用户登录,选择志愿服务的日期/时间,并
此查询在 invoices 上运行帮助我决定我需要付钱给谁的表格 这是基本表: 用户表 +---------+--------+ | user_id | name | +---------+---
我正在尝试开发一个网站来与我的 friend 进行一些协作头脑 Storm 。虽然有很多网站提供在线思维导图服务,但我想创建自己的网站,以便我们在集思广益时共享文件/数据。 所以,我正在寻找一个插件,
每次我重新开始理解 Objective-C 运行时,我的大脑都会变得困惑。据我所知(通过阅读一些很棒的文章,如 Metaclasses , Obj-C Runtime )Objective-C 类实际
我想知道如何使用 Espresso 重新运行失败的测试。我认为它比常见的 JUnit 测试用例要复杂一些,因为您需要在测试开始之前恢复应用程序中的状态。 我的方法是创建我自己的 ActivityTes
这是场景。我需要一个应用程序,该应用程序每 15 分钟轮询一次 Web 服务以及用户位置,无论是在后台还是前台。 此刻我: 启动/重新启动位置管理器,精度最高,距离过滤器无。 等待达到所需的准确度。
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 5年前关闭。 Improve thi
假设我有一个 DateTime,e。 G。 2010.12.27 12:33:58 我有一个间隔帧,假设是 2 秒,不包括最后一个边界。 所以,我有以下框架: 12:33:58(incl.)-12:3
我看到一条奇怪的错误消息,正在寻找一些关于可能是什么问题的想法。我对使用 JPA 有点陌生。 我有一个应用程序,我在其中使用 Spring 的实体管理器工厂 (LocalContainerEntity
我正在尝试找出一种使用 Watir-webdriver 检查 HTML 表格内容的方法。基本上我想根据保存的有效表格(CSV 文件)验证表格内容,并且在刷新或重绘操作后它们是相同的。 到目前为止,我提
这个问题已经有答案了: problem with email parsing with python and multiple Received records (1 个回答) 已关闭 6 年前。 对
我是一名优秀的程序员,十分优秀!