Objective-C:从另一个类

时间:2015-04-30 20:48:10

标签: ios objective-c class methods

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

但是我得到错误"选择器getTags"

没有已知的类方法

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

感谢。

2 个答案:

答案 0 :(得分:3)

我怀疑这一行;

NSArray *newarray = [class1 getTags];

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

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

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

答案 1 :(得分:2)

问题是代码$servername = "computername"; $username = "username"; $password = "password"; $dbname = "dbname"; // Create connection $mysqli = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } ?>

您正在NSArray *newarray = [class1 getTags];中调用类方法getTags;但是在class1中只有getTags的实例方法。

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

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

·H

class1

的.m

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

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

您不应将@implementation Class1 + (NSArray *)getTags { ... } @end 用作返回类型,并将idid分配给[class1 getTags]。那里有隐式转换,有时可能会导致一些良好的调试时间。

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