2011-04-18 4 views
0

현재 C에서 Objective-C로 이동 중이며,이 코드는 모두 멋쟁이 같지만 Xcode는 그렇지 않다고 생각합니다. 나는 인터넷에서이 코드 샘플을 얻고 끊임없이 그것을 해결하기 위해 노력하고 나는 데드 엔드에 왔어요 :이 단순한 Objective-C 코드는 정확히 무엇이 잘못 되었습니까?

#include <objc/Object.h> 

@interface Greeter:Object 
{ 
    /* This is left empty on purpose: 
    ** Normally instance variables would be declared here, 
    ** but these are not used in our example. 
    */ 
} 

- (void)greet; 

@end 

#include <stdio.h> 

@implementation Greeter 

- (void)greet 
{ 
    printf("Hello, World!\n"); 
} 

@end 

#include <stdlib.h> 

int main(void) 
{ 

    id myGreeter; 
    myGreeter = [Greeter new]; 

    [myGreeter greet]; 

    [myGreeter release]; 
    return 0; 
} 

오류가 myGreeter = [Greeter new]; 줄 것으로 보인다와 엑스 코드에 대한 무언가로 문제를 분리 스레드 1. alloc/init이 필요합니까?

[Switching to process 1833 thread 0x0] 
2011-04-18 21:52:10.323 PROJ[1833:903] *** NSInvocation: warning: object 0x100001160 of class 'Greeter' does not implement methodSignatureForSelector: -- trouble ahead 
2011-04-18 21:52:10.326 PROJ[1833:903] *** NSInvocation: warning: object 0x100001160 of class 'Greeter' does not implement doesNotRecognizeSelector: -- abort 
sharedlibrary apply-load-rules all 
Current language: auto; currently objective-c 
(gdb) 
+0

저는 전문가가 아니지만 왜 Greeter myGreeter = [Greeter new]입니까? 나는 "id"가 당신의 방법에 대해 알게 될 것이라고 믿지 않습니다. 비록 당신이 그것에 인사를 할 수 있다고해도 말입니다. – Marvo

+0

'new'와'alloc-init'은 같은 의미로 사용할 수 있습니다. Xcode가 말하는 콘솔 로그를 게시 할 수 있습니까? –

+0

@Marvo 괜찮을 것입니다. 경고를 주면 항상 그렇게하고 성가 시게하기 때문에 ID의 메소드를 호출 할 때 경고를 얻지 못합니다. 런타임에 객체가 무엇인지 파악하고 메소드를 찾는다. – Nektarios

답변

3

클래스, Greeter, 상속을 개체 전환 :보십시오. Cocoa에서 루트 클래스는 (일반적으로) NSObject이며,이 클래스를 상속해야합니다. 이로 인해 문제가 해결 될 수 있습니다.

0

이가 "주"의 기본 중단 점에서 바로 엑스 코드 디버거 정지 아닌가 : 다음

은 콘솔 로그입니까? 계속 (또는 실행 메뉴의 유사)을 클릭하면 황금색이어야합니다.

0

귀하의 예는 GNU 런타임을 사용하므로 다소 권장되지 않습니다. 넥스트 런타임 컴파일러 기본값하지만 스티븐 Kochan

으로 -fgnu-runtime

당신은 "목표 - C에서 프로그래밍"같은 목표 - C에 대한 좋은 책을 잡아 조사해야 컴파일 옵션과 함께 GNU 런타임을 사용하도록 설정할 수 있습니다

http://www.amazon.com/Programming-Objective-C-Stephen-Kochan/dp/0672325861

0

어쩌면 내가 잘못,하지만 난 항상 당신이 목표에 할당 생각했다 -을해야이

id myGreeter; 
myGreeter= [[myGreeter alloc] init]; 
+1

'new'는 기본적으로'alloc' /'init'을 하나의 메소드에 혼합하는 메소드입니다. 오에스 텐이 등장 할 무렵에는 쓸데없이 쓰러져 버렸지 만 Objective-C 책이나 다른 책을 (어떤 이유로 든) 사용하여 Objective-C를 사용하는 프로그래머가 최근에 사용하고있는 것으로 보입니다. – mipadi

2

Greeter:Object 같은 C 0, "Object"는 objective-c 클래스가 아닙니다.

+1

사실 그것은 원래 스펙의 오래된 Objective-C 클래스입니다.이 가져 오기를 사용하여 컴파일을 시도했지만 현대 Mac 용으로 컴파일되지 않은 것으로 보입니다. 편집 : 아, epatel에서 게시 당 문제가있는 런타임 같아요. –

0

당신이 상속하고 있기 때문에 사실, 당신은이 나타나는 코코아 이외의 목적-C를 사용하고, 종류는 ALLOC/초기화에 대한 속기는, 당신 그러나 약 here

를 읽을 수 있습니다 새로운 사용 객체가 아닌 NSObject 등등. 그래서 명시 적으로 myGreeter = [[myGreeter alloc] init]을 사용해야한다고 생각합니다.

또한 Xcode라고 말하기 때문에 Cocoa를 사용해야합니다.

#import <Cocoa/Cocoa.h> 

을 그리고 또한 목표 - C Object 클래스에서 NSObject의에

관련 문제