0

在我的第一个文件中,我希望能够引用我的第二个文件并更改它具有的属性,这就是我所拥有的。我创建了一个类方法来返回引用,但问题是我在方法中收到警告,最重要的是,当我执行 if 语句时,它似乎没有运行。

第一个需要引用的文件,调用类方法获取引用

-(void) updateSplitViewDetail{

id detail =  (MapViewController*) [MapViewController returnReference];
NSLog(@"%@", [detail class]); //This post MAPVIEWCONTROLLER

//This fails so I cant access the methods inside.
if ([detail isKindOfClass:[MapViewController class]]) {
    MapViewController *mapVC = (MapViewController*) detail;
    mapVC.delegate = self;
    mapVC.annotations = [self mapAnnotations];
}

}

 (void)viewDidLoad
  {
[super viewDidLoad];    
[self updateSplitViewDetail]; //Error may be here?
  }

我要引用的第二个文件,使用 self.return 返回引用。

- (void)viewDidLoad
{

NSLog(@"%@", [self class]);

[super viewDidLoad];
self.mapView.delegate = self;
// Do any additional setup after loading the view.
}

+(MapViewController*) returnReference{
//I also get an incompatible pointer return warning here?
return self;
}
4

2 回答 2

1
+(MapViewController*) returnReference {
    //I also get an incompatible pointer return warning here?
    return self;
}

您会收到警告,因为这是一个类方法(请参阅 +),因此this它的类型Class不是 type (MapViewController*)。它指的是MapViewController类而不是该类的实例。您返回的指针是类本身,而不是实例。这就是测试失败并且您无法在其他代码中调用实例方法的原因。

您可能想要实例化类并返回实例。

于 2012-08-14T00:39:03.120 回答
1

正如@AnalogFile 提到的,在类方法中,self是类对象本身,类对象detail也是MapViewController。即这是真的detail == [MapViewController class]

[detail class]也计算MapViewController类对象,因为调用class类对象上的方法调用+class,它返回类对象本身 (+class基本上是一个标识方法,返回它被调用的东西;不像-class。事实上,你的+returnReference方法基本上是一个 re-方法的实现+class。)。所以其实detail == [detail class]是真的。

[detail isKindOfClass:[MapViewController class]]另一方面,失败,因为它调用-isKindOfClass:(没有单独+isKindOfClass:的),它测试对象是否是该类的实例,并且您的类对象不是其自身的实例(类对象是其元类的实例,它遵循继承链到根类的元类,然后从根类本身继承)。

于 2012-08-14T09:20:42.903 回答