2012-02-11 10 views
1

클래스 A에는 UIImage가 있습니다.정적 변수를 잘못 사용 했습니까?

클래스 B가 클래스 B의 인스턴스가

전에 A 형의 클래스에 정적 참조가, I 클래스 A의 인스턴스를 할당 클래스 B의 정적 메소드를 호출 할

+ (void)setClassAReference:(ClassA*)classA 
{ 
    classA_ = classA; 
} 

가능합니까?

필자는 현재 프로젝트를 살펴보기 전에 샘플 값 하나를 생성하고 정수 값을 설정 한 다음 B 값을 저장하고 저장된 값을 유지하면서 액세스 할 수있었습니다. 클래스 A의

비 정적 방법 : 클래스 B의 인스턴스가

- (UIImage*)imageWithIdentifier:(ImageIdentifier)identifier; // identifier is enum type 

후, 내가하려고

는하지만, 내 현재 프로젝트에, 엑스 코드는 나를 정수 값을 전달할 수 있도록 거부 A의 메소드 호출 :

UIImage *img = [classA_ imageWithIdentifier:ImageIdentifier_Foo]; 

그러나 암시 적 변환 경고가 표시됩니다. 자동 완성 기능은 (ImageIdentifier) ​​대신 (ID)를 표시합니다. 나는 모든 메소드 시그니처를 세 번 검사했고 모두 enum 유형을 사용합니다.

정적 변수를 잘못 사용하고 있습니까? 아니면 다른 문제가 있습니까? 싱글 톤을 사용할 수 있다는 것을 알았지 만 가능하면하지 않을 것입니다.

여기 열거 선언을 추가 해요 : * 무고한 사람들을 보호하기 위해 변경

typedef enum 
{ 
    ImageIdentifier_Foo = 0, 
    ImageIdentifier_Bar 
} ImageIdentifier; 

* 실제 이름을.

당신이 당신이 NSObject의에 클래스 메소드를 사용하여 인스턴스화하기 전에 클래스에 정적 변수를 초기화하려면

+ (void) initialize 

이것은 당신이 당신의 정적를 ClassA 변수를 할당 할 수있는 곳입니다 첫째

+0

왜 '클래스'의 '인스턴스'가 생성되기 전에 '클래스'가 '인스턴스'에 대한 참조를 가질 필요가 있습니까? 'B'의 모든 인스턴스는'A'의 _ 인스턴스 _ 인스턴스를 가질 것입니다. –

+0

'A'는 'B'의 여러 하위 클래스에서 사용되는 몇 가지 이미지를 보유합니다. 나는 클래스들을 재사용 가능하게 만들고 싶어서, 각 앱마다 다른 이미지 이름을 가질 수있다. 각 하위 클래스가 정적 메서드로 한 번만 보내면 동일한 이미지 이름을 보낼 필요가 없습니다. – TigerCoding

답변

2

... ClassB에서. 둘째

....

확인 확실히 당신이를 ClassA 변수가, 그렇지 않으면이 해제됩니다 유지합니다. 당신의 암시 적 변환에 관한

셋째

.....

은 ... 변수 무엇인지 'A',이 위에 당신은 classA_을 썼다. enum 선언을 표시 할 수 있습니까? ClassA를 가져 왔습니까?

ClassA.h

typedef enum 
{ 
    ImageIdentifier_Foo = 0, 
    ImageIdentifier_Bar 
} ImageIdentifier; 

@interface ClassA : NSObject 

- (UIImage*)imageWithIdentifier:(ImageIdentifier)identifier; // identifier is enum type 

@end 

ClassA.m

#import "ClassA.h" 

@implementation ClassA 

- (UIImage*)imageWithIdentifier:(ImageIdentifier)identifier { 
    return nil; 
} 

@end 

ClassB가 :

나는이 어떤 컴파일 오류가 없습니다.오류가 정리되었다

#import "ClassB.h" 
#import "ClassA.h" 

static ClassA *classA; 

@implementation ClassB 

+ (void) initialize { 
    classA = [[ClassA alloc] init]; 
} 

- (void) doSomething { 
    UIImage *image = [classA imageWithIdentifier:ImageIdentifier_Foo]; 
    NSLog(@"image %@", image); 
} 

@end 
+0

클래스 A는 다른 클래스와 마찬가지로 [super init]을 호출하는 자체 init 메서드를 가지고 있습니다. 내가 ARC를 사용하기 때문에 나는 붙잡고 있지 않다. 나는 내 코드에서 실수를했다. 나는 'a'의 변수 이름을 바꿨다. 예, 형식 이름이있는 클래스를 가져옵니다. 이상하게도 클래스 A에서 인터페이스 메소드 서명에 '유형 예상'오류가 있지만 형식 헤더가 임포트되고 유형 이름이 파란색으로 표시되므로 컴파일러에서 유형 이름을 명확하게 표시합니다. 위의 enum 선언을 추가하십시오. 내가하고있는 일이 정확해야한다. 어쩌면 Xcode가 이상한가? – TigerCoding

+0

도와 주셔서 감사합니다. 이것은 나를 미치게했다. – TigerCoding

+0

당신이 그것을 할 수 있음을 분명히 보여 주었던 것처럼 정확하게 표시했습니다. – TigerCoding

0

시간

@interface ClassB : NSObject 

@end 

ClassB.m.

클래스 B의 .h 파일에서 클래스 A를 가져오고있었습니다. 클래스 B의 .m 파일에서도 가져 왔습니다. .h 파일에서 가져 오기를 제거하고이를 @class ClassA 및 모든 것을 자동으로 변경했습니다. 스스로 해결했다.

순환 참조로 인해 발생 했습니까?

+0

그렇게 생각하지 마십시오. 방금 샘플 코드를 사용해 보았지만 여전히 문제는 없었습니다. – bandejapaisa

+0

나는 Xcode가 망가 졌다고 생각한다. 당신의 도움을 주셔서 감사합니다. – TigerCoding

관련 문제