2014-01-20 1 views
1

안녕하세요 목적-C에 안돼서, 오늘은 동적 타이핑의 개념을 배우고 내가 쓴 내가 출력을 가지고동적 타이핑과 동적 바인딩을 사용하면서 이름이 같은 두 메서드 (다른 클래스에 속함)가 동일한 프로토 타입을 사용해야하는 이유는 무엇입니까?

#import <Foundation/Foundation.h> 
@interface A:NSObject 
@property int var; 
-(int)add:(A*)argObj; 
@end 

@implementation A 
@synthesize var; 
-(int)add:(A *)argObj 
{ 
    return (self.var + argObj.var); 
} 
@end 


@interface B:NSObject 
@property double var1; 
-(double)add:(B *)argObj; 
@end 

@implementation B 
@synthesize var1; 
-(double)add:(B *)argObj 
{ 
    return (self.var1 + argObj.var1); 
} 
@end  

int main() 
{ 
    @autorleaease{ 
     id data1, data2; 
     A * aobj1 = [[A alloc]init]; 
     aobj1.var = 30; 
     A * aobj2 = [[A alloc]init]; 
     aobj2.var = 50; 
     data1 = aobj1; 
     data2 = aobj2; 
     NSLog(@"The sum of two A objs is : %i",[data1 add: data2]);// prints 80 which is correct 

     B * bobj1 = [[B alloc]init]; 
     bobj1.var1 = 5.5; 
     B * bobj2 = [[B alloc]init]; 
     bobj2.var1 = 5.5; 
     data1 = bobj1; 
     data2 = bobj2; 
     NSLog(@"The sum of 2 B objs is : %f",[data1 add: data2]);// prints 0.0000 why so ???? 
    } 
     return 0; 
} 

이 프로그램을 실행하기 전까지는 추가를 실행하면 모든 것이 잘되었다, 결합했다 메서드를 클래스 A 개체에하지만 클래스 BI에 대한 add 메서드를 실행할 때 잘못된 대답을 얻었다. 왜 이런거야??

내 결과가 이렇게 보입니다. 출력에서 컴파일러는 컴파일러는 다양한 방법이 존재 말했지만이 방법이 완전히 다른 클래스에 속한 우리는 전화를 결합 동적 입력 및 동적를 사용하는 동안 제대로 잘 해결받을 것입니다이

main.m: In function 'main': 
main.m:47:5: warning: multiple methods named '-add:' found [enabled by default] 
    NSLog(@"The sum of two A objs is : %i",[data1 add: data2]); 
    ^
main.m:8:1: note: using '-(int)add:(A *)argObj' 
-(int)add:(A*)argObj; 
^ 
main.m:8:1: note: also found '-(int)add:(A *)argObj' 
main.m:26:1: note: also found '-(double)add:(B *)argObj' 
-(double)add:(B *)argObj; 
^ 
main.m:55:5: warning: multiple methods named '-add:' found [enabled by default] 
    NSLog(@"The sum of 2 B objs is : %f",[data1 add: data2]); 
    ^
main.m:8:1: note: using '-(int)add:(A *)argObj' 
-(int)add:(A*)argObj; 
^ 
main.m:8:1: note: also found '-(int)add:(A *)argObj' 
main.m:26:1: note: also found '-(double)add:(B *)argObj' 
-(double)add:(B *)argObj; 
^ 

Executing the program.... 
$demo 
2014-01-20 04:06:05.788 demo[30357] The sum of two A objs is : 80 
2014-01-20 04:06:05.789 demo[30357] The sum of 2 B objs is : 0.000000 

처럼 나에게 경고 ?? 그렇다면 왜 이런 결과가 나옵니까? 미리 감사드립니다. :)

+0

실제 개체가 아닌'id data1, data2'를 사용하는 이유는 무엇입니까? – trojanfoe

+0

그래, 내가 할 수 있었지만 동적 인 타이핑과 바인딩을 배웠던 이래로 나는이 개념들을 여기에서 사용하고 싶었다. 나는 런타임 동안 메소드에 대한 호출을 해결하기를 원했다. – iamyogish

답변

1

문제는 실제로 동적 바인딩 (예상대로 작동)이 아니라 매개 변수를 전달하는 것과 관련이 있습니다. 모호한 선택자는 컴파일러가 사용할 프로토 타입을 아는 것을 금지합니다.

Objective-C는 함수/메서드 호출 및 인수 전달에 C의 ABI를 사용합니다. 컴파일러는 인수의 유형을 알아야합니다. 변수가 강하게 입력되지 않으면 컴파일러는 올바른 선택기를 찾을 수 없습니다. 매개 변수가 호환되지 않으면 (이 경우) 정의되지 않은 동작이 발생합니다.

편집 : 컴파일러는 실제로 혼란에 대해 모두 알려줍니다A의를 추가 할 때

> main.m:47:5: warning: multiple methods named '-add:' found 
> NSLog(@"The sum of two A objs is : %i",[data1 add: data2]); 
> [...] note: using '-(int)add:(A *)argObj' 

이 처음 사용하기위한 것입니다. 컴파일러는 우연히 올바른 호출 인 클래스 A 변형을 사용했다는 것을 알려줍니다.

> main.m:55:5: warning: multiple methods named '-add:' found 
> NSLog(@"The sum of 2 B objs is : %f",[data1 add: data2]); 
> [...] note: using '-(int)add:(A *)argObj' 

두 개의 B 개체가있는 두 번째 로그 호출입니다. 다시 컴파일러는 두 개의 add: 선택기와 모호성이 있으며 A 변형을 선택했다는 사실을 알립니다. 이번에는 잘못된 옵션이고 런타임 중에 예기치 않은 결과가 표시됩니다.

+0

u said ** 변수가 강하게 입력되지 않으면 컴파일러는 올바른 선택자를 찾을 수 없습니다. **, 나는 의심 스럽네요. 내가 틀렸을 때 수정합니다. '[data1 add : data2 ]'반환 된 결과가 예상 결과와 처음 같았습니다. 이는 전달 된 매개 변수가 함수 선언의 인수를 사용하여 강력하게 형식화되었음을 의미합니다. 하지만 두 번째 동일한 전화를했을 때 왜 그것이 잘못된 대답을주는 것입니까? 컴파일러가 두 호출에서 동일한 선택기를 호출했기 때문에 ** ** – iamyogish

+0

@iamyogish 편집을 참조하십시오. –

+0

이해 : tnx .. – iamyogish

관련 문제