作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我见过一些类似于这个的 SO 问题,但它们都涉及单例,答案都是(正确地)“不要那样做,改用 dispatch_once()”。
在我的特定实例中,我没有制作单例,我需要父类(super class)的 allocWithZone:
返回我的子类的一个实例。
我想做的是:我想对我不拥有的现有库进行扩展。而不是在类别中做一堆行为——如果我覆盖现有行为,它甚至无法正常工作,因为没有定义调用许多相同签名方法中的哪一个——我希望它是,当有人包括我的(非常小的)类别时,然后调用
LibObject *myObj = [[LibObject alloc] init];
LibObject *myObj = [[MyLibObjSubclass alloc] init];
LibrarySubclass
是我正在创建的子类。特别是,作为
LibObject
子类的所有库对象,我希望它们成为
MyLibObjSubclass
的子类.
[MyLibObjSubclass alloc]
的无限递归之后,我最终崩溃了调用[LibObject alloc]
调用[MyLibObjSubclass alloc]
等,或 LibObject
子类的所有内容,而不是 MyLibObjSubclass
的子类,有了它的新行为,它只是一个 MyLibObjSubclass
,没有任何额外的行为。 UIView
-s 为
MyView
-s,其中
MyView
是
UIView
的子类.问题是,当我尝试分类时(作为
UIView+MyShim
的一部分),那么这一行:
UILabel *label = [[UILabel alloc] init];
UILabel
这是 MyView -> UIView -> UIResponder -> NSObject 的子类,它只返回一个
MyView
例如,其中不包含
text
属性(property),所以所有
UILabel
-s 坏了。
最佳答案
听起来您想从中修改类层次结构:
CCResponder
└─ CCNode
├─ CCControl
└─ CCSprite
CCResponder
└─ MyResponder
└─ CCNode
├─ CCControl
└─ CCSprite
class_setSuperclass
已弃用,没有受支持的方法可以在运行时进行更改。
CCResponder
创建一个新的子类。子类,在运行时按需提供。你最终会得到这样的层次结构:
CCResponder
└─ CCNode
├─ CCControl
│ └─ hacked_CCControl
└─ CCSprite
└─ hacked_CCSprite
CCControl
不是你可能直接实例化的东西,但让我们假装吧。)
+[CCResponder alloc]
与(您自己的)
+[CCResponder allocHack]
.你会实现这样的事情:
static Class createHackedClassForClass(Class originalClass) {
NSString *name = [@"hacked_" stringByAppendingString:NSStringFromClass(originalClass)];
Class hackedClass = objc_allocateClassPair(originalClass, name.UTF8String, 0);
// Here add methods as necessary to hackedClass using class_addMethod.
objc_registerClassPair(hackedClass);
return hackedClass;
}
+ (void)allocHack {
static NSMutableDictionary *hackedClassForClass = [NSMutableDictionary dictionary];
Class hackedClass = hackedClassForClass[self];
if (hackedClass == nil) {
hackedClass = createHackedClassForClass(self);
hackedClassForClass[self] = hackedClass;
}
return class_createInstance(hackedClass, 0);
}
关于ios - 如何指向 allocWithZone : to a subclass under ARC (NOT a singleton!),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25145717/
我是一名优秀的程序员,十分优秀!