Objective-C:从另一个 class 调用方法的语法

Objective-C: Syntax to call method from another class

iOS newb 试图从另一个 class 中提取一个数组,但出现错误。从根本上说,我并不真正理解方法和属性之间的区别,我意识到,所以这可能有助于我更好地理解它。

我创建了一个 returns 数组的方法。我想在另一个 class 中使用该数组(就像在其他语言中返回一个值的函数)所以我想我会按如下方式进行:

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;
}

换句话说,我想将该方法 returns 用作一种变量,在 Objective C 中称为属性。该方法也在 .h 文件中,因此它是 public.

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

NSArray *newarray = [class1 getTags];

但是我得到错误 "No known class method for selector getTags"

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

谢谢。

我怀疑这条线;

NSArray *newarray = [class1 getTags];

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

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

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

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

您正在 class1 中调用 class 方法 getTags;但是你在 class1.

中只有一个名为 getTags 的实例方法

要解决它,将方法签名中的 - 更改为 +,这会将您的方法从实例方法更改为 class 方法。 (在 java 术语中:+ 是您在方法中放置静态变量的位置)。

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

.h

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

.m

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

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

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

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