2010-05-06 4 views
30

문자열 리터럴 그룹화를 사용하여 NSArray를 만들려고하지만 "Initializer element is constant"라는 컴파일 오류가 발생합니다.문자열 리터럴을 사용하여 NSArray를 만드는 방법은 무엇입니까?

NSArray *currencies = [NSArray arrayWithObjects:@"Dollar", @"Euro", @"Pound", nil]; 

누군가 내가 잘못하고있는 것을 지적하고 오류 메시지를 설명 할 수 있습니까?

+0

코드가 작동해야합니다. 오류가 다른 곳에서 발생하지 않았습니까? – pheelicks

+0

방법에 넣지 않은 것처럼 들리므로 그 줄을 어디에 두 었는지 말해야합니다. – malhal

답변

18

NSArray 작성 자체에는 문제가 없습니다 (대신 [NSArray array]을 작성하면 동일한 오류가 발생합니다). 그러나 작성한 곳과 동일합니다. 나는이 전역 또는 파일 정적 NSArray 것 같아요. C에서, 그런 종류의 변수는 함수 호출 (또는 확장, 메소드 호출)이 아니라는 것을 의미하는 상수 초기화 기가 있어야합니다. 해결 방법은 배열을 만들기 전에 호출 할 메서드에 배열의 실제 생성 및 할당을 넣는 것입니다 (예 : initialize).

+1

나는 이것을 헤더 파일에서 선언했지만, 메소드 밖에서 이것을 초기화 할 수 없다는 것을 알지 못했다. – Kyle

+0

'+ load' 안에 넣어도 안전할까요? – user102008

0

해당 코드에는 아무 문제가 없습니다. 해당 줄에서 오류가 발생하고 있습니까?

2

나는 목표 - C에서 초보자 해요,하지만 난 올바른 코드라고 생각 :

있는 NSArray * 통화 = [[NSArray를의 ALLOC] initWithObjects "달러"@ "유로"@ @ "파운드", nil];

확실하지 않습니다.

+2

또한 유효하지만 OP 코드에는 아무런 문제가 없습니다. 당신의 방법은 간단히 배열을 유지하지만 그의 코드는 – pheelicks

+0

이 아닙니다. 그러나 정적 변수에 저장된 객체가 ** 유지되지 않는다면, 이는 숨어있는 크래셔 버그이므로 alloc/init이 올바른 일일 것입니다. – jlehr

7

척 (Chuck)이 문제를 발견 한 것처럼 들립니다. 솔루션을 코딩 할 때 정적 변수에 NSArray의 자동 릴리즈 된 인스턴스를 저장하는 것을 피하기를 원할 것입니다. 또한, 이러한 상황에 대한 일반적인 패턴과 같이 정적 변수에 저장된 값을 생성하고 반환하는 클래스 메소드 작성하는 것입니다 :

+ (NSArray *)currencies 
{ 
    static NSArray *_currencies; 

    // This will only be true the first time the method is called... 
    // 
    if (_currencies == nil) 
    { 
     _currencies = [[NSArray alloc] initWithObjects:@"Dollar", @"Euro", @"Pound", nil]; 
    } 

    return _currencies; 
} 
+0

안녕하세요, 왜 자동 변수 개체를 정적 변수에 저장하지 않는 것이 좋습니까? 효율성을 위해 모든 루프에서 보유 개수를 묻지 않습니까? –

+1

autorelease 풀의 객체에 보유 수를 묻지 않습니다. autorelease 풀이 해제 될 때'release' 메시지가 전송됩니다.autoreleased 오브젝트가 정적 변수에 저장되면 변수는 잘못된 주소를 포함하게되고,이 변수를 참조하려고하면 프로그램이 충돌하거나 악화되어 할당 된 새 오브젝트에 잘못 액세스하게됩니다 임시 주소. – jlehr

+0

예, autorelease 객체를 유지하면 풀이 비었을 때 객체의 할당이 해제되지 않는다고 명시되어 있습니다. appkit을 사용하면 autorelease 풀이 각 이벤트 루프에서 생성되고 그 끝에서 제거됩니다. 그래서 나는 콜 카운트를 유지한다고 생각합니다. –

3

이 오래했지만를, 애플에 새로운 패치를 저지른 통지하십시오 llvm 프로젝트는 NSArray, NSDictionaryNSNumber에 대한 새로운 Objective-C 리터럴 구문에 대한 지원을 추가합니다.

NSArray *currencies = @[@"Dollar", @"Euro", @"Pound"]; 

을 그리고 네는 방법 안에 있어야 :

herehere

67

이 마술을 시도하십시오.

+0

메서드 내부에있는 경우 동적으로 배열을 할당 할 것입니다. 나는 그것을 정적 상수 배열로 기대했다. – Andy

관련 문제