相关疑难解决方法(0)

Objective-C:从超类获取子类列表

在Objective-C中有一种方法可以询问类是否存在任何子类实现.

我有一个Base类,它有多个子类.我想循环遍历所有子类并在每个子类上执行类选择器.

编辑:

我有一组可以处理某些类型数据的类.每个处理器都对一个基类进行子类化,该基类提供每个处理器所需的方法.

每个类都知道它可以处理哪些数据,而某些类可以比其他类更好地处理某些类型的数据.

我想在每个类上都有一个类方法,它会向工厂类提供一个响应,表示我可以处理该数据,并指出它可以处理它的程度.

然后工厂根据哪个类说它可以最好地处理数据来决定实例化哪个类.

我也从2009年发现了这个问题(我在发布之前进行了搜索,但没有发现任何内容)在Obj-C中发现给定类的子类.

编辑2:

+ (void)load方法看起来是我正在寻找的完美解决方案.所以我现在有以下内容:

+ (void)registerSubclass:(Class)subclass {
    NSLog(@"Registered %@", subclass);
}
Run Code Online (Sandbox Code Playgroud)

在我的基类中,这是我的潜艇.

+(void)load {
    [BaseSwitch registerSubclass:[self class]];
}
Run Code Online (Sandbox Code Playgroud)

现在,这将显示每个子类的调试消息.

我的下一个问题是(可能是一个愚蠢的问题),如何存储在registerSubclass方法中注册的类.有没有办法让我可以在以后阅读的类变量?

编辑3:

在这里找到一些示例代码Cocoa中一个简单,可扩展的HTTP服务器

这给我留下了以下内容,看起来很简单,看起来很简单.但我想我会把它放在这里供将来参考.

@implementation BaseSwitch

static NSMutableArray *registeredSubclasses;

+ (void)registerSubclass:(Class)subclass {
    if (registeredSubclasses == nil) {
        registeredSubclasses = [[NSMutableArray alloc] init];
    }

    [registeredSubclasses addObject:subclass];

    NSLog(@"Registered %@", subclass);
}

+ (void)logSubclasses {
    for (int i = 0; i < [registeredSubclasses count]; i++) {
        NSLog(@"%@", [registeredSubclasses objectAtIndex:i]); …
Run Code Online (Sandbox Code Playgroud)

objective-c

11
推荐指数
2
解决办法
3758
查看次数

objc_copyClassList:更新到 iOS 13.4 / XCode 11.4 后崩溃 EXC_BAD_INSTRUCTION

更新到 iOS 13.4 / XCode 11.4 后

这段代码

func getSubclassInfos() -> [ClassInfo] {
    let superObject = CityModel.self
    let superClassInfo = ClassInfo(superObject)

    var subclassList = [ClassInfo]()
    var count = UInt32(0)
    guard let classList = objc_copyClassList(&count) else {
        return subclassList
    }
    for i in 0..<Int(count) {
        let clazz = classList[i] // Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
        if let classInfo = ClassInfo(classList[i]),
            let superclassInfo = classInfo.superclassInfo,
            superclassInfo == superClassInfo
        {
            subclassList.append(classInfo)
        }
    }

    return subclassList
}
Run Code Online (Sandbox Code Playgroud)

崩溃的线let clazz = classList[i]EXC_BAD_INSTRUCTION …

xcode objective-c ios swift

4
推荐指数
1
解决办法
474
查看次数

使用Generic将Storyboard链接到UIViewController

我有这个视图控制器,用于以通用方式呈现模型对象的详细信息:

class APIModelDetailsVC<T where T: APIModel>: UIViewController {...}
Run Code Online (Sandbox Code Playgroud)

我希望我的故事板能够使用这个课程.我可以在Interface Builder中分配它:

在此输入图像描述

我在tableview的didSelect方法中准备了这个ViewController(包括指定通用占位符的类型):

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
  print("didSelectRowAtIndexPath \(indexPath.row)")
  if let vc = UIStoryboard(name: "APIModelDetailsVC", bundle: nil).instantiateInitialViewController() as? APIModelDetailsVC<StarWarsPerson> {
    vc.model = data[indexPath.row]
    self.navigationController?.pushViewController(vc, animated: true)
  }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试导航到此视图控制器时,出现以下控制台错误:

Unknown class _TtC14api_collection17APIModelDetailsVC in Interface Builder file.
Run Code Online (Sandbox Code Playgroud)

这是故事板的记录限制吗?有没有一种方法可以/应该指定通用,以便故事板可以链接到它?

interface-builder ios

3
推荐指数
1
解决办法
2002
查看次数

标签 统计

ios ×2

objective-c ×2

interface-builder ×1

swift ×1

xcode ×1