objective-c-runtime相关内容

截取所有目标c#方法调用。

我希望每当在我的iOS应用程序中调用方法时插入挂钩。假设有一个选择符X,我希望在方法执行之前记录“方法X开始”,然后在执行后记录“方法X结束”。我知道一种方法,在这种方法中,我可以将sel X的实现与调用“self”前后具有钩子的实现混合在一起,以便在方法执行时通知我。但是,这只有在我事先知道方法的情况下才能奏效。我希望为所有执行的方法插入钩子,即使我无权访问执行它的类的源代码(例如,执行内部方法 ..
发布时间:2022-04-14 18:52:59 移动开发

在 dealloc 中使用 self.property = nil 有什么问题吗?

我知道声明的属性会生成访问器方法,这在某种程度上只是语法糖. 我发现很多人在他们的 dealloc 方法中使用了 self.property = nil. 1) 在 Apple 的内存管理文档中,第 23 页它说: 唯一不应该使用访问器方法来设置实例变量的地方是在 init 方法和 dealloc 中. 为什么不应该? 2) 在苹果的 Objective-C 2.0, ..
发布时间:2022-01-02 18:41:53 移动开发

在 Xcode 7 中更改了 +load 方法顺序

我发现 Xcode 7(版本 7.0 (7A220))改变了在单元测试期间调用类和类别的 +load 方法的顺序. 如果属于测试目标的类别实现了 +load 方法,那么现在在最后调用它,此时类的实例可能已经被创建和使用. 我有一个 AppDelegate,它实现了 +load 方法.AppDelegate.m 文件还包含 AppDelegate (MainModule) 类别.此外,还 ..
发布时间:2021-12-09 19:19:39 移动开发

如何完全用 C 编写 iOS 应用程序

我在这里阅读在Objective-C之前学习C? 通常我然后用纯C代码替换一些Obj-C代码(毕竟你可以随意混合它们,一个Obj-C方法的内容可以完全是纯C代码) 这是真的吗? 是否可以完全使用 C 编程语言构建 iPhone 应用程序? 解决方案 该死,我花了一段时间,但我明白了: ma​​in.c: #include #include #include //这 ..
发布时间:2021-12-01 18:07:30 移动开发

指定初始化器应该只在“超级"上调用指定初始化器 使用协议时?

我有以下结构.我得到了符合 protocol A 的 class B.protocol A 定义了一个指定的初始化器,它是-(instancetype)initWithInt:(int)count. 但是,当我在 class B 中实现标准的 -(instancetype)init 并使其使用也在 class B 中实现的指定初始化程序时,我收到警告“指定的初始化程序应该只在 'super' ..
发布时间:2021-09-30 20:06:19 移动开发

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

1) object_getIvar(id object, Ivar ivar) 如果 Ivar 是一个对象,则返回一个“id",例如.如果变量是 NSString,则大概是包含该值的 id = NSString.那是对的吗?或者我需要做什么才能访问 Ivar 的值. 2) 如果 Ivar 是一个浮点数/整数等.将返回什么以及如何将其转换为我可以使用的内容(浮点数或整数很好,因为我可以使用 N ..

在 Objective-C 中将字符串转换/编译为可执行代码

我想在 ObjC 中获取一个字符串并将其作为代码进行评估.例如(这些是组合函数): NSString *Cmd=@" if (10>5) NSLog(@"Test"); ";MyClass.Run(Cmd); 我希望“测试"出现在输出日志中.我已经搜索并测试了很多代码示例和库,但仍然没有很好的结果. 我最终得到了这 2 个用于运行时编译的库: 1- libClang 框架和 cla ..
发布时间:2021-07-06 18:45:59 移动开发

Swift:替代 .classForCoder()

给定以下代码: return TyphoonDefinition.withClass(AppDelegate.classForCoder()) {(定义)在definition.injectProperty("程序集")}) ...有必要使用 .classForCoder(),因为 .class() 被删除了.与简单的 .class() 相比,这当然是不直观的.有没有提供更好可读性的替代方案 ..
发布时间:2021-06-11 20:56:37 移动开发

Objective C - 获取方法的参数类型?

在运行时,我需要能够获取方法的参数类型.以下是打印出来的内容: 我读过其他线程,在运行时目标 c 将传递给方法的所有对象视为 id 的参数.如果这种方法对读取参数类型的方法没有任何其他建议? 日志 2014-02-07 15:47:08.962 OCInjection[55727:70b] @2014-02-07 15:47:08.964 OCInjection[55727:70b] ..
发布时间:2021-06-11 20:40:17 移动开发

理解 Objective-C 运行时

我已经阅读了关于 Objective-C 运行时的工作原理,所以如果我误解了什么,请评论. 假设我有一个名为 Person 的类.该类可能有也可能没有 getSex 方法. Person *p = [[Person alloc]init]; 这里为Person实例分配了内存(isa也被创建,它指向Person类),init用于初始化Person的ivar [p getSex]; 这里 ..
发布时间:2021-06-11 20:37:49 移动开发

Foundation 能否告诉我一个 Objective-C 方法是否需要一个特殊的结构返回?

我理解的背景:Objective-C 方法调用基本上是一个带有两个隐藏参数(接收器和选择器)的 C 函数调用.Objective-C 运行时包含一个名为 objc_msgSend() 的函数,它允许以这种方式调用方法.不幸的是,当一个函数返回一个结构体时,可能需要一些特殊的处理.有一些神秘的(有些人可能会说是疯狂的)规则控制结构是否像其他值一样返回,或者它是否实际上是通过隐藏的第一个参数中的引用返 ..
发布时间:2021-06-11 20:23:24 移动开发

具有未知数量参数的 IMP

是否可以创建一个参数数量与正在解析的实例方法的选择器相匹配的 IMP? 我可以使用“if"语句和有限数量的参数(比如在 0 到 10 之间),但是是否可以使用带有 va_args 的 IMP_implementationWithBlock ? 解决方案 你不能在 C 中在运行时创建函数;在编译时必须知道参数的数量. 您可以使用可变参数函数来假装您有一个带有任意数量参数的函数,( ..
发布时间:2021-06-11 20:17:21 移动开发

Objective-C 运行时:声明符合协议的 Class (objc_class) 类型的变量是什么意思?

Class bah = [NSString class];id 对象 = [bah new]; 编译完全没有问题. Classbah = [NSString 类];id 对象 = [bah new]; 返回错误“选择器'new'没有已知的类方法". 为什么第一个实例可以调用NSObject上定义的+new方法,而第二个实例却不能? 解决方案 根据 Apple 的文档: 协 ..
发布时间:2021-06-11 20:08:50 移动开发

如何动态添加类方法?

使用 Objective-C 运行时,如何将方法 +layerClass 添加到私有 UIGroupTableViewCellBackground 类(而不是其超类 UIView>)?注意:这仅用于测试(查看UITableViewStyleGrouped 如何设置单元格backgroundView & selectedBackgroundView). 解决方案 动态添加类方法,而不是实例方 ..
发布时间:2021-06-11 20:07:37 移动开发