【问题标题】:iPhone OS: Get a list of methods and variables from anonymous objectiPhone OS:从匿名对象中获取方法和变量列表
【发布时间】:2011-02-23 09:22:39
【问题描述】:

我正在构建我的第一个 iPhone/Obj-c 应用程序,并且我有大量的数据保存子类,我将它们传递给一个 cite 函数。对于 cite 函数,这些对象是匿名的,我需要找到一种方法来访问每个传递对象的所有变量。 我一直在使用预先构建的 NSArray 和 Selectors 来执行此操作,但是有超过 30 个条目(并且还在增长),手动执行有点愚蠢。必须有一种方法可以动态查找匿名对象的所有变量。

obj-c runtime 运行时文档提到了这个问题,但据我所知,这在 iPhone OS 中不可用。如果是这样,那么我不了解实施并需要一些指导。 A similar question 之前有人问过,但我再次认为他们在谈论 OSX 而不是 iPhone。

有什么想法吗?

-(NSString*)cite:(id)source {
 NSString *sourceClass = NSStringFromClass([source class]);

 // Runs through all the variables in the manually built methodList
 for(id method in methodList) {
  SEL x = NSSelectorFromString(method);
  // further implementation

 // Should be something like
 NSArray *methodList = [[NSArray alloc] initWithObjects:[source getVariableList]]
 for(id method in methodList) {
  SEL x = NSSelectorFromString(method);
  // Further implementation
 }

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

    Mac 上的运行时与 iPhone 上的运行时相同。如果另一个问题符合您的要求,那么它应该可以工作。如果没有,请提交错误。

    同时,给定Class,您可以使用class_copyMethodList() 函数检索其所有选择器的列表:

    unsigned int numMethods = 0;
    Method * methods = class_copyMethodList(sourceClass, &numMethods);
    NSMutableArray * selectors = [NSMutableArray array];
    for (int i = 0; i < numMethods; ++i) {
      SEL selector = method_getName(methods[i]);
      [selectors addObject:NSStringFromSelector(selector)];
    }
    free(methods);
    

    【讨论】:

    • 你实现它的方式几乎和我想象的完全一样,但我错过了最简单的东西,那就是顶部的#import 。我只是假设这是全局的,并且由于另一个问题,这些方法无效。多哈。所以我得到了这个工作,但另一个问题出现了。这仅列出当前类实现的方法,而不列出任何超类方法。我想我将不得不遍历所有课程,很有趣。谢谢。
    • @Chris 是的,必须以相同的方式发现超类方法。 :)
    【解决方案2】:

    通过 Objective-C 运行时函数当然可以做到这一点,但这可能不是正确的方法。由于您正在创建传递给 cite 方法的对象,因此只需让它们各自实现一个协议,该 cite 可以使用该协议来提取它需要的任何信息。

    类似键值编码协议的东西可能会做你想做的事: http://developer.apple.com/iphone/library/documentation/cocoa/Conceptual/KeyValueCoding/KeyValueCoding.html

    【讨论】:

    • 我同意这一点。如果对象可互换传递,它们应该实现一个通用接口。这是 Objective-C 的动态 OO 系统的一大优势。
    • 在浏览了一堆 KVC 和协议教程之后,我有点困惑,因为这两者都有帮助,尤其是 KVC。我喜欢您的协议想法,但在这种情况下我将如何使用它?我会返回所有 iVar 的 NSArray 吗?如果是这种情况,那么我不会回到在每个类的协议实现中使用运行时吗?我正在创建对象并知道其中的内容,但我想构建它,就好像我不知道一样。让 cite 函数向班级询问它所拥有的 iVars 似乎是正确的方法,但我是 objc 和 cocoa 的新手,也许有更简单的方法。
    • 就像这样:你的“cite”方法想要对这些对象做一些事情。协议的目的是为这些对象提供一个通用接口,以便与 cite 方法进行互操作。通常,将对象仅用作一组公共属性被认为是不好的风格。如果需要,请使用 NSDictionary。
    猜你喜欢
    • 2013-04-13
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2012-11-06
    • 2011-09-08
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    相关资源
    最近更新 更多