2009-12-08 9 views
0

여기가 이상합니다.'TileMap'이 '+ mapNamed :'에 응답하지 않을 수 있습니다.

@implementation TileMap 

+ (id)mapNamed:(NSString *)filename 
{ 
    return [[self alloc] initWithFile:filename]; 
} 

- (id)initWithFile:(NSString *)filename 
{ 
    if (self = [super init]) 
    { 
     // ... 
    } 
    return self; 
} 


@end 

를하지만 내 응용 프로그램에 [TileMap mapNamed:@"map.plist"];에 전화를 추가 할 때 엑스 코드는 경고 :

@interface TileMap : NSObject 
{ 
    int *data; 
    int tilesWide; 
    int tilesHigh; 
    NSString *imageName; 
} 

+ (id)mapNamed:(NSString *)filename; 
- (id)initWithFile:(NSString *)filename; 

@end 

구현은 다음과 같습니다 : 나는 다음과 같은 인터페이스를 TileMap라는 이름의 클래스가

'TileMap'이 '+ mapNamed :'에 응답하지 않을 수 있습니다.

응용 프로그램이 올바르게 컴파일되고 NSLog (TileMap-initWithFile:) 내의 호출이 기록됩니다. Xcode의 구문 색상 지정이이 클래스와 메서드에서 해제되어 클래스와 메서드를 각각 따로 이름을 바꾸어 보았습니다. 경고 및 구문 색칠 문제를 제거한 유일한 조합은 클래스와 메서드의 이름을 바꾸는 것이 었습니다.

일부 문서화되지 않은 프레임 워크 클래스 또는 메서드와 충돌하고 있습니까? 문서에서 찾기는 아무 것도 밝히지 않습니다. Find in Project는 호출, 인터페이스 정의 및 구현 만 표시합니다. 나는 많이 먹지 않는다. 기존의 명명 규칙을 무시하지 않고이 문제를 해결할 수있는 방법이 있습니까?

답변

2

Finder에서 볼 수 있지만 Xcode에서는 볼 수없는 두 개의 TileMap.h 및 TileMap.m 파일로 프로젝트 디렉토리가 나타납니다. 하나, 완전한 인터페이스와 구현, 내 루트 프로젝트 디렉토리에. 다른 하나는 내 프레임 워크 하위 디렉토리의 맨손으로 된 NSObject 하위 클래스입니다. 어떻게 된 일인지 잘 모르겠습니다. 후자를 삭제하면 문제가 해결됩니다. 같은 데이브에게 도움을 주셔서 감사합니다.

5

#import TileMap.h 헤더를 사용 했습니까? TileMap.h 헤더를 저장 했습니까?

+0

* 부끄러움에 머리를 응답하지 않는다 * 난 그렇게처럼 내 모든 프레임 워크 헤더를 가져 오는 framework.h 있습니다. \t // ... \t # import를 "State.h" \t # import를 "TileMap을 .h " \t // ... 그런 다음 framework.h를 비 프레임 워크 파일,이 경우에는 StateState.h ('State' 확장)로 가져옵니다. 이 방법으로 가져온 다른 클래스 및 메서드로 인해 경고 또는 구문 색이 이상하게 들릴 수 있지만 그게 옳습니다. framework.h에서'#import "TileMap.h"를 제거하고 TitleState.m에 직접 추가하면 경고가 사라집니다 (색칠 문제는 계속되지만 그걸로 살아갈 수 있습니다). –

+0

나는 이것이 내 질문에 대답했다고 생각했지만 그것에 대해 좀 더 생각해 보았다. 클래스와 메서드의 이름을 변경하면 왜 문제가되지 않겠는가? –

1

숀, 당신에 대해 물어 문제 외에

은 또한 +mapNamed:에서 메모리 누수가 있습니다. 다음 줄은 기본적으로 호출자에게 소유권을주는 하나의 유지 수,과 비 오토 릴리즈 객체 반환

return [[self alloc] initWithFile:filename]; 

Memory Management Programming Guide for Cocoa에 따라, 당신은 이와 같은 편리한 메소드에서 객체를 오토 릴리즈 반환해야합니다 : 당신은 스노우 레오파드 (Snow Leopard)와 엑스 코드 3.2이있는 경우

return [[[self alloc] initWithFile:filename] autorelease]; 

, 당신은 Cmd를 + 시프트 + A를 눌러이 하나 실수를 찾을 수있는 정적 분석기를 실행하려고 할 수 있습니다.

+0

감사합니다 알렉산더, 알아두면 좋을 것 같습니다. –

+0

2011 년 또는 그 이후에 이것을 읽는 분들에게 ARC가 없었을 때 작성되었습니다. 이것은 ARC를 사용할 때 더 이상 적용되지 않지만 수동 메모리 관리에는 여전히 적용됩니다. –

관련 문제