2011-01-10 4 views
4
에 전송되었습니다.

Objective-C를 배우고 일부 샘플 코드를 사용해 보았습니다. 다음과 같은 오류 메시지가 나타납니다 :알 수없는 셀렉터가 클래스

unrecognized selector sent to class 

여기 내 코드입니다. Basics.m

#import <Foundation/Foundation.h> 
#import "Fraction.h" 

int main (int argc, char *argv[]) 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    Fraction *myFraction; 

    // Create an instance of a Fraction 

    myFraction = [Fraction alloc]; 
    myFraction = [Fraction init]; 

    // set Fraction to 1/3 
    [myFraction setNumerator: 1]; 
    [myFraction setDenominator: 3]; 

    // Display the value using the print method 
    NSLog(@"The value of myFraction is:"); 
    [myFraction print]; 
    [myFraction release]; 

    [pool drain]; 
    return 0; 
} 

Fraction.h

#import <Foundation/Foundation.h> 

// -- interface section --// 
@interface Fraction : NSObject { 
    int numerator; 
    int denominator; 
} 

// public method signatures 
-(void) print; 
-(void) setNumerator: (int) n; 
-(void) setDenominator: (int) d; 
@end 

Fraction.m

//--implementation section --// 
@implementation Fraction 
-(void) print 
{ 
    NSLog(@"%i/%i",numerator,denominator); 
} 
-(void) setNumerator: (int) n 
{ 
    numerator = n; 
} 
-(void) setDenominator: (int) d 
{ 
    denominator = d; 
} 
@end 

답변

15

alloc

클래스 방법이지만 init는 인스턴스 메소드이다. 귀하의 코드에서 컴파일러는 정확한 클래스 메서드 인 init을 찾을 수 없다는 불평을합니다.

myFraction = [Fraction alloc]; 
myFraction = [myFraction init]; 

을하지만, 가장 일반적인 패턴은 둥지에이 같은 호출입니다 :이 문제를 해결하려면, 당신과 같이, 당신은 alloc에서 다시받은 인스턴스에 따라 init를 호출해야합니다 이것은 또한 도움이

// calls -init on the object returned by +alloc 
myFraction = [[Fraction alloc] init]; 

할당되었지만 아직 초기화되지 않은 객체의 메소드를 호출하여 발생할 수있는 오류를 방지합니다.

+0

감사합니다. – redconservatory

4

중첩 된 alloc/init 전화와 관련하여 언급 된 것 외에 관심이있는 내용은 입니다. 당신의 Fraction 클래스 구현,이 같은 방법을 추가

- (NSString *) description 
{ 
    return [NSString stringWithFormat:@"%i/%i", numerator, denominator]; 
} 

을 이제,이 같은 NSLog 문에서 직접 사용할 수 있습니다 :이 대답은 잠시 전에 내가 싶었다 알고

// set Fraction to 1/3 
[myFraction setNumerator: 1]; 
[myFraction setDenominator: 3]; 

// Display the value using the print method 
NSLog(@"The value of myFraction is: %@", myFraction); 
+0

특정 프랙 션 클래스는 Objective-C의 Big Nerd Ranch 책에서 나왔다고 생각합니다. 그래서 결국 결국 나타날 것입니다. –

2

약간의 업데이 트를 제공합니다. 당신이 초기화 alloc/init를 사용하는 경우는 그냥

[Fraction new]

및 이와 동등한 것을 단축 할 수 있습니다.