objective-c-runtime相关内容
我用Swift测试了 isa swizzling ,发现它仅在NSObject是超类时才有效(直接或进一步),或使用'@objc'装饰.否则,它将遵循静态和vtable-dispatch样式,例如C ++. 在没有Cocoa/NSObject基类的情况下定义Swift类是否正常?如果我担心的话,这意味着要放弃Objective-C的大部分活力,例如方法拦截和运行时自省. 动态运行时行为
..
因此,我又在弄乱objc-runtime(感到惊讶),并且发现了一个有趣的代码块const char *sel_getName(SEL sel) { #if SUPPORT_IGNORED_SELECTOR_CONSTANT if ((uintptr_t)sel == kIgnore) return ""; #endif return sel ? (const
..
如果我在运行时动态生成方法然后调用它们-我如何说服编译器该类将响应未声明的(生成的)方法并使其不引发警告? 有关答案的更新 当我生成方法时-在编译时不知道它们的名称.举个例子-如果我有一个视图控制器MyFooController并且它是用方法initWithFoo:(Foo*)foo启动的,那么我将能够为UINavigationController生成类似pushMyFooContro
..
我正在尝试从类对象本身获取类的字符串名称. // For instance [NSArray className]; // @"NSArray" 我找到了object_getClassName(id obj),但这需要将实例传递给它,对于我而言,这是不必要的工作. 那么如何从类对象中获取字符串,而不是实例呢? 解决方案 NSString *name = NSStringFr
..
在Objective-C中,如何获得元类对象? [self class]和[ClassName class]都仅返回Class对象. 解决方案 编辑:根据Greg在评论中的建议进行了改进. object_getClass([Class class]);
..
通过Xcode连接到调试器时,LLDB提供了一个有用的局部变量视图(屏幕截图的左下方): 我发现了一个LLDB命令frame variable(和gdb的info locals),该命令提供了局部变量列表(如上图右侧所示). 我希望此功能可以在运行时在设备上执行.例如,我可以使用backtrace_symbols()访问堆栈跟踪,通过_cmd访问当前选择器,以及其他一些访问. 有
..
我正在尝试实施isa swizzling,因为我需要在某些对象的dealloc方法中进行一些操作.我覆盖-(Class)class;返回原始类的方法(如KVO一样).一切正常,直到我尝试将观察者添加到陷入困境的对象中为止.它只是崩溃了. 0x00000000()中的0x00000000 0x0091d22a在 _NSKeyValueRetainedObservationInfoForObj
..
object_getIvar(id object,Ivar ivar)正确读取iVArs的值,但在BOOL类型iVar上失败并崩溃。 我需要一个类的所有iVars的值。有什么方法可以解决它。 解决方案 object_getIvar似乎返回与手册所说内容相反的实际值(不是id)。如果您使用ARC,这将在尝试保留不是对象的返回值时立即导致处理器故障。 object_getInstanc
..
在我接受的一个项目中,原作者选择使用 objc_setAssociatedObject()而我并不是100%明白它的作用或为什么他们决定使用它。 我决定查阅它,不幸的是,文档对其目的并不十分具有描述性。 objc_setAssociatedObject 使用给定的密钥和关联策略为给定对象设置关联值。 void objc_setAssociatedObject (id obj
..
我有一个类设置,理想情况下会读取传入的任何类的方法,然后在运行时将它们全部映射到单个选择器上,然后将它们转发到原始选择器。 这现在可以正常工作,但我一次只能使用一种方法。问题似乎是,一旦我调整第一个方法,我的IMP捕获和转发方法现在已经与其他方法IMP交换。由于他们使用新交换的IMP替换其他IMP,所以进一步尝试这个搞砸了。 1)所以我有MethodA,MethodB和CustomCa
..
似乎我们使用 getPropertyType(..)的应用程序在ios7下失败。无论出于何种原因, getPropertyType(..) on例如NSString属性返回 NSString $'\ x19 \ x03 \ x86 \ x13 作为类型,而不仅仅是NSString,而不是NSNumber,它返回 NSNumber \ xf0 \ x90 \ xae \ x04 \ xff \ xf
..
我很好奇是否有任何工具为此提供部分解决方案。由于performSelector,这是一个棘手的问题。 。 。但是工具应该至少能够提出候选人,使人的工作变得更容易。 解决方案 使用静态分析,由于Objective-C的动态特性,无法检测已定义但未使用的功能/方法。唯一合理的解决方案是使用 GCov 或类似工具。即使这样,你也必须让你的程序尽一切可能,以确保你不会删除一些在测试过程中没有使用过
..
我接受了采访,并被要求用Objective-C和Swift创建内存泄漏。那么如何使用Objective-C和Swift创建内存泄漏? 解决方案 您只需要创建一个参考周期。 Obj-C: @interface MyClass @property(strong)MyClass * otherObject; @end // ... MyClass * a = [
..
我一直在寻找一种方法来使用可选的协议方法并拥有干净的代码。换句话说: 1:否 respondsToSelector:调用我的代码全部 2.应该适用于任何方法签名,所以在NSObject上进行检查并调用 performSelector:的类别方法已经用完(并且NSInvocation与ARC合作有问题) 3:这个解决方案,IMO,假装是普遍的但是有所有缺点1 我最终提出了这个
..
给出一些我为什么要问这个问题的背景:基本上我想改变iOS上谷歌地图的 myLocationButton 的位置。所以我首先按如下方式获取实际按钮: @implementation GMSMapView(UIChanges) - ( UIButton *)myLocationButton { UIButton * myLocationButton; for([setting
..
我有一个使用SocketRocket的依赖项(通过CocoaPods安装)并从HeapAnalytics导入静态库的项目。显然,HeapAnalytics库已经使用了SocketRocket。编译时没有错误,但在运行时收到以下内容: 类SRWebSocket在[path]和[path]中实现]。 将使用其中一个。哪一个未定义。 我不知道如何处理它,因为我见过的大多数解决方
..
我正在研究如何将属性(在本例中为整数)添加到所有 UIView 实例,无论它们是否为子类。在类别中使用 objc_setAssociatedObject()和 objc_getAssociatedObject()是否采用Apple认可的相应方式? 我听到一些担心这构成了“运行时黑客”,并且可能导致难以追踪和调试的问题。有没有人见过这类问题?是否有更好的方法将整数属性添加到所有 UIView
..
有没有人设法在arc下使用objc_getClassList,而不是为有问题的文件关闭弧? 基本问题是其中一个参数是C类指针数组。 解决方案 此代码应在ARC下运行: int numClasses; Class * classes = NULL; classes = NULL; numClasses = objc_getClassList(NULL,0);
..
我发布这个问题是因为我看到很多关于这个主题的混淆,因此我花了几个小时调试NSOperation子类。 问题在于NSOperation在异步回调完成之前执行非实际完成的异步方法时,你做得不好。 如果NSOperation本身就是回调委托它可能甚至不足以正确完成操作,因为在不同的线程上发生回调。 让我们说你在主线程中并创建一个NSOperation并将其添加到NSOperationQ
..
我发现Xcode 7(版本7.0(7A220))改变了在单元测试期间调用类和类别的 + load 方法的顺序。 如果属于测试目标的类别实现了 + load 方法,则现在调用它的最后一个实例该类可能已经被创建和使用。 我有一个 AppDelegate ,它实现了 + load 方法。 AppDelegate.m 文件还包含 AppDelegate(MainModule)类别。此外,还有一
..