繁体   English   中英

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

[英]Objective-C: Syntax to call method from another class

iOS newb试图从另一个类中提取数组,并且出现错误。 我知道,从根本上来说,我并不真正了解方法和属性之间的区别,因此这可能有助于我更好地理解这一点。

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

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

但是我收到错误消息“选择器getTag的未知类方法”

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

谢谢。

我怀疑这条线;

NSArray *newarray = [class1 getTags];

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

因此,您的代码应如下所示;

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

问题是代码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用作返回类型,而[class1 getTags]中的id分配给NSArray * 那里有一个隐式转换,有时可能会导致一些调试时间。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM