2012-08-14 2 views
0

첫 번째 파일에서 두 번째 파일에 대한 참조를 가져 와서 속성을 변경하고 싶습니다. 이것은 내가 가진 것입니다. 참조를 반환하는 클래스 메서드를 만들었지 만 문제는 if 메서드를 수행 할 때 맨 위에는 메서드가 실행될 것 같은 경고가 표시됩니다. , 참조를 필요로다른 클래스에 대한 참조 만들기 Objective C

첫 번째 파일은 내가 반환 자체를 사용하여 참조 할 참조를 원하는

-(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? 
    } 

두 번째 파일을 참조 얻기 위해 클래스 메소드를 호출합니다. 이 클래스 메소드합니다 (+ 참조) 그러므로 this 형태가 아닌 (MapViewController*)의 유형 Class입니다 때문에

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

답변

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

당신은 경고를 얻을. 이 클래스는 해당 클래스의 인스턴스가 아닌 MapViewController 클래스를 나타냅니다. 반환 할 포인터는 인스턴스가 아닌 클래스 자체입니다. 이것이 테스트가 실패하고 다른 코드에서 인스턴스 메소드를 호출 할 수없는 이유입니다.

아마도 클래스를 인스턴스화하고 대신 인스턴스를 반환하고 싶을 것입니다.

1

@AnalogFile 언급 한 바와 같이, 클래스 메서드 내에서 self은 클래스 객체이므로, detailMapViewController 클래스 객체입니다. 즉, detail == [MapViewController class]이 사실입니다. -class 달리, 클래스 개체에 class 메소드를 호출하는 클래스 객체 자체를 반환하는 +class를 호출하기 때문에

[detail class]+class 그것이에 호출 된 일을 반환, 기본적으로 식별 방법 (즉, MapViewController 클래스 객체로 평가합니다. 사실 +returnReference 메서드는 기본적으로 +class 메서드를 다시 구현 한 것입니다.). 사실 detail == [detail class]이 사실입니다. 이 객체가 클래스의 인스턴스 인 경우 테스트하는 -isKindOfClass:가 (별도의 +isKindOfClass:가 없다)를 호출하고 클래스 개체 자체의 인스턴스 (클래스가 아니기 때문에

[detail isKindOfClass:[MapViewController class]]

, 다른 한편으로는, 실패 객체는 메타 클래스의 인스턴스이며, 루트 클래스의 메타 클래스에 대한 상속 체인을 따라 가며 루트 클래스 자체에서 상속합니다.

+0

그래서 두 번째 파일에 mapviewcontroller 속성을 만들고 반환 참조 및 인스턴스 변수를 만들어 반환하고 첫 번째 파일에서 mapviewcontroller 인스턴스를 사용하여 호출하면 작동합니다.> –

+0

@TerrelGibson : 나는 그렇지 않습니다. 네가하는 말을 정말로 이해한다. 그러나'+ returnReference'는 클래스 메소드이기 때문에 클래스의 메소드 일뿐입니다. 그것은 인스턴스의 방법이 아닙니다. 인스턴스에서'returnReference'를 호출하려고하면'-returnReference'가 없으므로 작동하지 않습니다. – newacct

+0

+ returnReference를 -ReturnReference로 변경하면 어떻게됩니까? –

관련 문제