2013-04-06 4 views
1

상수에 대한 getter 및 setter를 만들 수 있습니까? 나는 상수를 직접 참조하고 값이 0 인 경우 인스턴스화하도록하고 싶다. 다음과 같이 선언 된 상수 :상수에 대한 게터 및 세터?

// Prefs.h 
extern MyClass * const kThing; 

// Prefs.m 
MyClass * const kThing = nil; 

와 게터/세터과 같습니다

// getter 
+ (MyClass *)kThing 
{ 
    _kThing = _kThing ? : [MyClass new]; 
    return _kThing; 
} 

// setter 
+ (void)setKThing:(MyClass *)myClass 
{ 
    _kThing = myClass 
} 

그리고 나는 그것을 좋아 사용할 수 있습니다

[kThing doSomething]; 

이 가능합니까?

편집 다른 파일에 클래스 메소드에

+1

'kThing'을 전역 변수로 선언하고 있습니까? 그렇다면 왜 getter 및 setter 인스턴스 메소드가 있습니까? – drewmm

+0

@drewmm 네, 전 세계적인 상수가되고 싶습니다. 클래스 메소드로 변경하여 더 명확하게했습니다. 저 클래스의 멤버가되어야하는 클래스가 확실하지 않지만 ... 그냥 예제로 사용했습니다. – zakdances

+0

단어 상수를 조회하는 시간 .. ?? – Rob

답변

1

글로벌 변수 선언 방법을 편집 객관적 C.에 이상적으로 우리가 sharedInstance를 사용하여 매우 위험합니다. 이 같은 시도 : MyGame.h

@interface MyGame : NSObject 
{ 
    int mScore; 
} 
@property(nonatomic,assign) int score; 
+(MyGame*)sharedObject; 
-(void)someFunction; 
@end 

에서

을 MyGame.m

static MyGame *gGame = nil; 

@implementation MyGame 

@synthesize score = mScore; 

+(MyGame*)sharedObject 
{ 
    if(!gGame) 
    { 
     gGame = [[MyGame alloc] init]; 
    } 
    return gGame; 
} 

-(void)someFunction 
{ 

} 
@end 

에서 어디서든 프로젝트에 액세스하려면 : 당신이 상수가 아닌 무엇을 설명

 #import "MyGame.h" 

    [MyGame sharedObject].score; 
    [MyGame sharedObject] someFunction]; 
+1

어디에서나 globale을 사용하는 것은 매우 위험합니다.링커에서 끔찍한 암묵적 마스킹 및 이중 기호로 연결됨 – CodaFi

2

, 그것들은 전역 변수입니다. getter와 setter를 정의 할 수는 없지만 그 값을 사용하여 수행 한 작업과 동일한 클래스 메소드를 사용할 수 있습니다.

그러나, 당신은 당신의 게터를 우회, 글로벌 변수에 직접 사용이

[kThing doSomething]; 

같은 메시지를 보냅니다. 당신이 게터를 통해 가고 싶은 경우에, 당신은 당신이

[[[self class] kThing] doSomething]; 

또 다른 메모를 작성할 수 있습니다

[[MyClass kThing] doSomething]; 

또는 MyClass 내부의 방법을 쓸 수 요 그런 접근 방법을 구현할 때, 당신은을해야한다는 것입니다 정적 변수 인 백킹 변수는 extern이 아닙니다. 이렇게하면 다른 모듈이 getter를 우회하여 이러한 변수에 액세스 할 수 없게됩니다.

1

짧은 대답은 이것이 가능하지 않다는 것입니다.

MyClass * const kThing = nil; 

kThing 그것이 가리키는 메모리 주소가 변경 될 수 없다는 것을 의미 상수 포인터 것을 의미한다. 따라서 일단 nil으로 설정되면 나중에 새 개체로 설정할 수 없습니다.