objective-c-runtime相关内容
我希望每当在我的iOS应用程序中调用方法时插入挂钩。假设有一个选择符X,我希望在方法执行之前记录“方法X开始”,然后在执行后记录“方法X结束”。我知道一种方法,在这种方法中,我可以将sel X的实现与调用“self”前后具有钩子的实现混合在一起,以便在方法执行时通知我。但是,这只有在我事先知道方法的情况下才能奏效。我希望为所有执行的方法插入钩子,即使我无权访问执行它的类的源代码(例如,执行内部方法
..
我知道声明的属性会生成访问器方法,这在某种程度上只是语法糖. 我发现很多人在他们的 dealloc 方法中使用了 self.property = nil. 1) 在 Apple 的内存管理文档中,第 23 页它说: 唯一不应该使用访问器方法来设置实例变量的地方是在 init 方法和 dealloc 中. 为什么不应该? 2) 在苹果的 Objective-C 2.0,
..
我发现 Xcode 7(版本 7.0 (7A220))改变了在单元测试期间调用类和类别的 +load 方法的顺序. 如果属于测试目标的类别实现了 +load 方法,那么现在在最后调用它,此时类的实例可能已经被创建和使用. 我有一个 AppDelegate,它实现了 +load 方法.AppDelegate.m 文件还包含 AppDelegate (MainModule) 类别.此外,还
..
我在这里阅读在Objective-C之前学习C? 通常我然后用纯C代码替换一些Obj-C代码(毕竟你可以随意混合它们,一个Obj-C方法的内容可以完全是纯C代码) 这是真的吗? 是否可以完全使用 C 编程语言构建 iPhone 应用程序? 解决方案 该死,我花了一段时间,但我明白了: main.c: #include #include #include //这
..
我有以下结构.我得到了符合 protocol A 的 class B.protocol A 定义了一个指定的初始化器,它是-(instancetype)initWithInt:(int)count. 但是,当我在 class B 中实现标准的 -(instancetype)init 并使其使用也在 class B 中实现的指定初始化程序时,我收到警告“指定的初始化程序应该只在 'super'
..
不能子类化DispatchGroup,怎么做? 注意: 这终于在 iOS 10+ 中得到修复 例如,携带一个带状态的包, class PushDispatchGroup: DispatchGroup {var sentIds: [(tableName: String, rowId: String)] = []} 感谢shallowThought 指出iOS10 中已修复此问题
..
1) object_getIvar(id object, Ivar ivar) 如果 Ivar 是一个对象,则返回一个“id",例如.如果变量是 NSString,则大概是包含该值的 id = NSString.那是对的吗?或者我需要做什么才能访问 Ivar 的值. 2) 如果 Ivar 是一个浮点数/整数等.将返回什么以及如何将其转换为我可以使用的内容(浮点数或整数很好,因为我可以使用 N
..
我想在 ObjC 中获取一个字符串并将其作为代码进行评估.例如(这些是组合函数): NSString *Cmd=@" if (10>5) NSLog(@"Test"); ";MyClass.Run(Cmd); 我希望“测试"出现在输出日志中.我已经搜索并测试了很多代码示例和库,但仍然没有很好的结果. 我最终得到了这 2 个用于运行时编译的库: 1- libClang 框架和 cla
..
给定以下代码: return TyphoonDefinition.withClass(AppDelegate.classForCoder()) {(定义)在definition.injectProperty("程序集")}) ...有必要使用 .classForCoder(),因为 .class() 被删除了.与简单的 .class() 相比,这当然是不直观的.有没有提供更好可读性的替代方案
..
在运行时,我需要能够获取方法的参数类型.以下是打印出来的内容: 我读过其他线程,在运行时目标 c 将传递给方法的所有对象视为 id 的参数.如果这种方法对读取参数类型的方法没有任何其他建议? 日志 2014-02-07 15:47:08.962 OCInjection[55727:70b] @2014-02-07 15:47:08.964 OCInjection[55727:70b]
..
我已经阅读了关于 Objective-C 运行时的工作原理,所以如果我误解了什么,请评论. 假设我有一个名为 Person 的类.该类可能有也可能没有 getSex 方法. Person *p = [[Person alloc]init]; 这里为Person实例分配了内存(isa也被创建,它指向Person类),init用于初始化Person的ivar [p getSex]; 这里
..
为了简化,假设我有一个这样的函数 void myFunc(id _self, SEL _cmd, id first, ...){} 在那个方法中,我想调用 _self 超类的实现(imp).我可以使用此代码访问该 IMP: Class class = object_getClass(_self);类超类 = class_getSuperClass(class);IMP superimp =
..
我理解的背景:Objective-C 方法调用基本上是一个带有两个隐藏参数(接收器和选择器)的 C 函数调用.Objective-C 运行时包含一个名为 objc_msgSend() 的函数,它允许以这种方式调用方法.不幸的是,当一个函数返回一个结构体时,可能需要一些特殊的处理.有一些神秘的(有些人可能会说是疯狂的)规则控制结构是否像其他值一样返回,或者它是否实际上是通过隐藏的第一个参数中的引用返
..
我正在尝试使用此方法:class_addMethod() 在 Obj-c 中是这样使用的: class_addMethod([self class], @selector(eventHandler), imp_implementationWithBlock(handler), "v@:"); 我在 Swift 中是这样使用它的: class_addMethod(NSClassFromStri
..
是否可以创建一个参数数量与正在解析的实例方法的选择器相匹配的 IMP? 我可以使用“if"语句和有限数量的参数(比如在 0 到 10 之间),但是是否可以使用带有 va_args 的 IMP_implementationWithBlock ? 解决方案 你不能在 C 中在运行时创建函数;在编译时必须知道参数的数量. 您可以使用可变参数函数来假装您有一个带有任意数量参数的函数,(
..
我正在实现一个“代码注入器类",通过方法混合可以让你有可能做这样的事情: FLCodeInjector *injector = [FLCodeInjector injectorForClass:[self class]];[注入器injectCodeBeforeSelector:@selector(aSelector:) 代码:^{NSLog(@"这个代码应该被注入");}]; aSelect
..
给定一个Objective-C类型type,可以获得encoding encoding 和 size 类型的大小很容易: const char *encoding = @encode(type);size_t size = sizeof(type); 换一种说法,我们有映射 @encode: type_t ->常量字符 *大小:type_t ->尺寸_t 这引发了两个问题: (1)
..
Class bah = [NSString class];id 对象 = [bah new]; 编译完全没有问题. Classbah = [NSString 类];id 对象 = [bah new]; 返回错误“选择器'new'没有已知的类方法". 为什么第一个实例可以调用NSObject上定义的+new方法,而第二个实例却不能? 解决方案 根据 Apple 的文档: 协
..
我想知道以下两种方法中哪一种是检索 Class 变量的超类的正确或首选方法: Class getSuperclass(Class cls) { return [cls superclass];} Class getSuperclass(Class cls) { return class_getSuperclass(cls);} 解决方案 好吧,docs 说: 你通常应该使
..
使用 Objective-C 运行时,如何将方法 +layerClass 添加到私有 UIGroupTableViewCellBackground 类(而不是其超类 UIView>)?注意:这仅用于测试(查看UITableViewStyleGrouped 如何设置单元格backgroundView & selectedBackgroundView). 解决方案 动态添加类方法,而不是实例方
..