我想将一个对象的实例转换为该对象类的子类的一个实例,以便我可以在Objective-C中使用该子类的其他方法和属性。 我怎样才能做到这一点,而不需要我在复制方法中硬编码该对象类的属性?
我注意到与XCode(4.6)的最新更新,我被告知JSONKit.m几行。 具体而言,设置对象类的行: dictionary->isa = _JKDictionaryClass; 这些被标记为不推荐使用,注意首选方法是使用object_setClass() : object_setClass(dictionary, _JKDictionaryClass); 当我问到为什么宁愿简单地使警告消失时,答复是: 一切正常,即使新的Xcode版本抱怨,我不想: 1)testing每个项目,我使用JSONKit检查是否一切正常后object_setClass() 2)松散的CPU周期,这就是为什么我使用NSJSONSerialization JSONKit的例子。 我当前的应用程序分析重量为600K-1M的json文件 我们在这里谈论的是多大的performance? 注 : 我更感兴趣 dictionary->isa = _JKDictionaryClass vs object_setClass() 比JSONKit vs NSJSONSerialization 。
似乎我们的应用程序使用getPropertyType(..)在ios7下失败。 不pipe什么原因, getPropertyType(..) on例如一个NSString属性返回NSString$'\x19\x03\x86\x13作为types,而不是NSString,而不是NSNumber它返回NSNumber\xf0\x90\xae\x04\xff\xff\xff\xff 。 所有这一切都造成了一些棘手的问题,当我后来检查一个特定的types。 我已经改变了这个(遗留下来的)代码来使用isKindOfClass ,但是我不明白这里发生了什么。 有问题的代码: #import <objc/runtime.h> static const char *getPropertyType(objc_property_t property) { const char *attributes = property_getAttributes(property); char buffer[1 + strlen(attributes)]; strcpy(buffer, attributes); char *state = buffer, *attribute; while ((attribute = strsep(&state, ",")) != NULL) { if (attribute[0] == 'T') { return (const char *)[[NSData dataWithBytes:(attribute + 3) length:strlen(attribute) – […]
我很好奇,是否有任何工具可以为此提供部分解决scheme。 这是一个棘手的问题,因为performSelector。 。 。 但一个工具应该至less能够拿出候选人,使人类的工作更容易。
我试图dynamic确定Objective-C中的属性的types。 根据我在这个网站和其他地方阅读的内容,我相信我正在做正确的事情。 但是,我的代码不起作用。 下面的代码片段演示了这个问题。 尝试获取“backgroundColor”和“frame”的属性信息,这两个属性都是UIView的有效属性,失败(class_getProperty()返回NULL): id type = [UIView class]; objc_property_t backgroundColorProperty = class_getProperty(type, "backgroundColor"); fprintf(stdout, "backgroundColorProperty = %d\n", (int)backgroundColorProperty); // prints 0 objc_property_t frameProperty = class_getProperty(type, "frame"); fprintf(stdout, "frameProperty = %d\n", (int)frameProperty); // prints 0 枚举这里描述的属性也不会产生预期的结果。 以下代码: NSLog(@"Properties for %@", type); unsigned int outCount, i; objc_property_t *properties = class_copyPropertyList(type, &outCount); for (i = 0; […]
我正尝试调用canPerformAction:withSender:方法为UIResponder及其所有子类重写此方法。 我这样做是通过将原始实现存储在按类名称键入的字典中; 并在调用原始实现之前,在实现的debugging版本中查找字典。 这似乎在某些情况下可以正常工作,但在原始实现调用super时失败。 然后我的方法不断地被调用,程序进入无限recursion。 这里有什么可能是错的?
我一直在寻找一种方法来使用可选的协议方法,并有干净的代码。 换一种说法: 1:No respondsToSelector:全部调用我的代码 2,应该为任何方法签名工作,所以NSObject做检查和调用performSelector:的类别方法是out(和NSInvocation有问题与ARC合作) 3:这个解决scheme ,国际海事组织,假装是普遍的,但具有1的所有缺点 我最终想出了这个想法: @protocol MyProtocol <NSObject> @optional -(void)optionalMethod; @end @interface ClassA : NSObject <MyProtocol> @end @implementation ClassA -(void)optionalMethod{ NSLog(@"ClassA implements optionalMethod"); } @end @interface ClassB : NSObject <MyProtocol> @end @implementation ClassB //classB does not implement optionalMethod @end @interface NSObject (DefaultMyProtocolImplementation) -(void)optionalMethod; @end @implementation NSObject (DefaultMyProtocolImplementation) -(void)optionalMethod{ NSLog(@"%@ does not implement […]
我有一个项目,有一个依赖(通过CocoaPods安装)使用SocketRocket,并已从HeapAnalytics导入静态库。 显然,HeapAnalytics库已经使用SocketRocket。 编译时我没有遇到任何错误,但在运行时会收到以下内容: Class SRWebSocket is implemented in both [path] and [path]. One of the two will be used. Which one is undefined. 我不知道如何处理它,因为我见过的大多数解决scheme都需要自己编译静态库来更改类名称等,而且我无法访问源代码。 任何build议?
我基本上正在寻找一种方法来检测何时/什么第三方库swizzle。 我最近遇到了一个广告库使用了AFNetworking的古怪分支的情况。 AFNetworking调整NSURLSessionTask,并且在某些情况下两个swizzles不能很好地播放。 我真的希望能够检测和理智检查这种事情,理想情况下,甚至保持在应用程序中的每个debugging方法的版本化的转储,所以我们有一些可见的谁是猴子修补什么和风险是什么。 谷歌和堆栈溢出search已经没有什么了,但只有一堆教程如何swizzle。 有人遇到这个问题或有解决办法? 它看起来像我可以使用objc / runtime.h编码的东西,但我无法想象我是第一个需要这个人。
我正在研究如何在所有UIView实例中添加一个属性(在这种情况下是一个整数),无论它们是否是子类。 正在使用objc_setAssociatedObject()和objc_getAssociatedObject()在一个适当的,苹果认可的方式来做到这一点? 我曾经听到过一些担心这构成了“运行时间黑客”,并可能导致难以追踪和debugging的问题。 有没有其他人看到这种types的问题? 有没有更好的方式来添加整数属性到所有UIView实例没有子类? 更新:我不能只使用tag ,因为这需要在已经使用tag的其他事物的代码库中使用。 相信我,如果我能用这个tag ,我会的!