【问题标题】:Can you inherit from a class in objc not available at compile time?您可以从编译时不可用的 objc 中的类继承吗?
【发布时间】:2012-12-06 12:44:54
【问题描述】:

我有继承自 iOS 6 中引入的 UIActivity 的代码,它可以使用 Xcode 4.5 编译罚款,并且在 iOS 6 和以前的版本上运行良好(我在运行时检测到该类的可用性)。但是,是否可以使用 Xcode 4.4 编译此代码,该版本在其 SDK 中包含 UIActivity 类?

如果我转发声明 UIActivity dealloc 方法不会编译,因为它调用 super 并且编译器警告我该类已经在继承树的根目录。也许有一种方法可以让这个类从我在本地定义的代理类继承,然后在运行时以某种方式调整它并实例化它,就好像它在编译时已经正确定义了一样?这样做的目的是使用 Xcode 4.4 编译代码并使用该 phantom 类在 iOS 6 上运行二进制文件。

我知道我可以使用定义来阻止我的子类使用 Xcode 4.4 及更早版本进行编译,但这意味着该功能在运行 iOS 6 的设备上不可用。

【问题讨论】:

  • 可以使用条件编译。
  • 为什么要限制自己使用 Xcode 4.4?
  • Xcode 4.5 仅支持在 iOS 4.3 及以上设备上部署。我仍然想支持old(我的)硬件。我不喜欢大公司强迫我购买新硬件仅仅因为。因此,如果有办法让新课程发挥作用……否则我将求助于stackoverflow.com/questions/12619124/…
  • @GrzegorzAdamHankiewicz 我知道你的意思。我这里有一台不错的 iMac,它“不能”运行 ML。

标签: objective-c ios inheritance weak-linking


【解决方案1】:
@interface UIActivityDummy : NSObject
//Copy UIActivity methods to avoid compiler warnings
@end

@implementation UIActivityDummy
@end

@interface MyClass : UIActivityDummy
@end

@implementation MyClass

+ (void) initialize {
    Class activityClass = objc_getClass("UIActivity");
    if (activityClass) {
        class_setSuperclass([MyClass class], activityClass);
    }
    NSLog(@"%@", [[MyClass class] superclass]);
}

@end

【讨论】:

【解决方案2】:

在这里,我只是详细说明了我们如何才能在运行时上课。希望它会是您所需要的。请检查一下。

只需使用:

objc_lookUpClass(myClass);// 它检查所需的类。 objc_getClass(myClass);//这就是你需要的。

请检查语法,因为我不确定。但是,有一次我用过这个,也能得到 ivar 和方法,也能在运行时添加方法。

如有任何问题,请回复我。 :)

【讨论】:

    猜你喜欢
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    相关资源
    最近更新 更多