【问题标题】:Objective-C: Syntax to call method from another classObjective-C:从另一个类调用方法的语法
【发布时间】:2015-07-10 17:35:29
【问题描述】:

iOS 新手尝试从另一个类中提取数组并出现错误。我意识到,从根本上说,我并不真正理解方法和属性之间的区别,因此这可能有助于我更好地理解这一点。

我创建了一个返回数组的方法。我想在另一个类中使用该数组(就像一个返回其他语言值的函数),所以我想我会这样做:

class1
- (id) getTags{
    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Tags"];
    fetchRequest.resultType = NSDictionaryResultType;

    NSError *error      = nil;
    NSArray *results    = [self.managedObjectContext executeFetchRequest:fetchRequest
                                                                   error:&error];

    NSMutableArray * tags = [[results valueForKey:@"tag"] mutableCopy];
    return tags;
}

换句话说,我想将该方法返回的内容用作一种变量,在 Objective C 中称为属性。该方法也在 .h 文件中,因此它是公开的。

在第 2 类中,我在顶部导入第 1 类,然后尝试调用方法如下:

NSArray *newarray = [class1 getTags];

但是我收到错误“选择器 getTags 没有已知的类方法”

谁能告诉我我做错了什么?

谢谢。

【问题讨论】:

    标签: ios objective-c class methods


    【解决方案1】:

    我怀疑这条线;

    NSArray *newarray = [class1 getTags];
    

    实际上,您应该使用类实例,而不是类本身。 要使用这种函数调用,您应该将 getTags 声明为类级函数(+函数),而不是 - 函数

    所以你的代码应该是这样的;

    class1 *class1Instance = [[class1 alloc] init];
    NSArray *newarray = [class1Instance getTags];
    

    【讨论】:

      【解决方案2】:

      问题是代码NSArray *newarray = [class1 getTags];

      你在class1中调用类方法getTags;但是,class1 中只有一个名为 getTags 的实例方法。

      要解决这个问题,请将方法签名中的 - 更改为 +,这会将您的方法从实例方法更改为类方法。 (在 Java 术语中:+ 是在方法中放置静态的位置)。

      但是,您的代码中存在很多样式问题。 首先,我不认为将代码放入 .h 是一个好习惯。你可能想要的是

      .h

      @interface Class1
      + (NSArray *)getTags;
      @end
      

      .m

      @implementation Class1
      + (NSArray *)getTags { ... }
      @end
      

      所以你在 .h 文件中声明你的公共接口并在 .m 中实现。此外,您可能希望将您的班级名称大写。

      您不应使用id 作为返回类型并将id[class1 getTags] 分配给NSArray *。那里有一个隐式转换,有时可能会导致一些良好的调试时间。

      NSArray 可以用作方法的返回类型,因为 NSMutableArray 继承自 NSArray - Apple Documentation of NSMutableArray

      【讨论】:

      • 我最初尝试了 NSArray,但它给出了错误“返回类型冲突”,并且在下面的返回行中给出了错误“从结果类型不兼容的函数返回 NSMutableArray*____strong”。切换到 id 消除了这两个错误。
      • 您是否使用NSArray * 作为返回类型而不是NSArray?这是人们第一次学习 Obj-C 时的常见错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2013-03-05
      • 2015-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多