문제

OS 3 용 앱을 컴파일하려고하면 다음 오류가 발생했습니다.

오류 : 액세서 유형은 속성 유형과 일치하지 않습니다.

오류는 액세스하려고 시도한 속성에 대한 오류가 다음과 같이 정의되었습니다.

NSMutableArray *myArray

@property (readonly,nonatomic) NSArray* myArray;

속성은 구현 파일에서 @synthesized입니다.

이것은 OS 2.2.1에서 잘 작동했지만 OS 3.0은 아닙니다.

Getter 방법을 작성하면 문제가 해결되었습니다.

OS 2.2.1과 3.0 사이의 Objective-C 변경 사항을 알고 있습니까? 이러한 변경 사항에 대한 문서가 있습니까?

그만큼 API는 문서를 변경합니다 이 문제에 대해 아무것도 포함하지 않는 것 같습니다.

편집하다

오류는 속성에 액세스하려고 할 때 발생합니다.

NSArray *anArray = myClass.myArray;

위에서 언급했듯이 나는 이것에 대한 해결 방법을 찾았습니다. getter 방법을 직접 작성하지만, 내가 실제로 후에 나가는 것은 Apple의 문서와 API와 관련이없는 다른 변경 사항을 설명하는 일종의 문서입니다.

당신의 도움을 주셔서 감사합니다

도움이 되었습니까?

해결책

이것은 컴파일러 버그입니다.

완전히 지정하지는 않았지만 코드가 다음과 같이 보일 것으로 예상됩니다.

@interface Foo : NSObject {
    NSMutableArray *objects;
}
@property (readonly, copy) NSArray *objects;
@end

@implementation Foo
@synthesize objects;
@end

불행히도 컴파일러는 objects 재산 그리고 선언의 선언 objects 인스턴스 변수. 특성과 인스턴스 변수는 Objective-C에서 다른 것입니다. 속성은 인스턴스 변수로 뒷받침 될 수 있지만 실제로 클래스의 공개 인터페이스의 일부입니다.

인스턴스 변수의 이름을 접두사하는 등 인스턴스 변수의 정의 정의를 속성의 정의에서 명확하게 분리하기 위해 코드를 변경 하여이 문제를 해결할 수 있습니다.

@interface Foo : NSObject {
    NSMutableArray *_objects;
}
@property (readonly, copy) NSArray *objects;
@end

@implementation Foo
@synthesize objects = _objects;
@end

이런 식으로 컴파일러는 속성에 대해 혼란스러워하지 않습니다. self.objects (어쨌든 말해서는 안되지만 분명히).

불가피한 응답을 떠나기 위해 : Apple 하지 않습니다 예를 들어 변수에 대한 언더 베어 접두사를 예약하십시오. 방법을 위해 예약되어 있습니다. 어쨌든, 언더 베어를 싫어한다면 다른 접두사를 자유롭게 사용하십시오.

다른 팁

편집하다: 동료 검토가 부족한 것으로 나타났습니다. 이 문제에 대한 Chris Hanson의 의견을 읽으십시오. 나는 그것이 여전히 유효하다고 생각하기 때문에 나머지를 여기에두고 있습니다.


속성 유형을 선언하더라도 NSArray, 반환 된 객체는 여전히 an입니다 NSMutableArray, 그리고 돌연변이 가능한 방법 ~이다 그것에 대해 정의되었습니다. 이런 식으로 재산을 선언합니다 ~ 아니다 누군가가 실수로 배열을 돌리는 것을 방지하십시오.

반환 된 배열이 변하지 않으려면 원래 예제에서와 같이 속성을 선언 한 다음 자신의 액세서를 굴릴 수 있습니다.

- (NSArray *)myArray { return [NSArray arrayWithArray:myArray]; }

이것은 보존되지 않은 것을 반환합니다 NSArray. 객체가 지속되어야하는 경우 객체의 소유권을 가져 오는 것은 발신자에게 달려 있습니다.

Xcode가 이제 이전에는 없었던 것들에 대한 경고와 오류를 발행하고 있기 때문에 오류가 발생합니다 ...

나는 당신이하고있는 일을하는 것이 가장 경고해야한다고 주장 할 것입니다. 나는 배열을 외부 세계에 불변으로 제시하려는 시도를 이해하지만 수업 내부에서는 변이 할 수 있습니다. 서로 다른 이름을 가진 다른 액세서를 고려할 수 있으며, 구체적으로 변한 배열을 반환하기 위해 만들어졌습니다.

여전히 객관적인 C 2.0입니다. 컴파일러는 이런 종류의 유형이 오류를 변경하는 것을 고려하여 약간 업데이트 될 수 있습니다. 거의 오류가되어야합니다. 적어도 그것은 당신이 쓴 것을 의미하지 않을 것이라고 경고해야합니다. 그러면 당신은 그것을 경고하지 않기 위해 물건을 캐스팅 할 수 있습니다. @synthesize 성명.

방금 코드와 합성 진술을 컨트롤러에 정확히 붙여 넣었고 오류 나 경고가 없습니다. 잘 만들어졌습니다. 이제 기본 SDK를 "Simulator 3.0"으로 설정하고 빌드는 "Simulator 3.0 Debug"로 설정했습니다. 이 프로젝트는 2.2.1 SDK에서 시작되었으며 어제 3.0 SDK를 설치했습니다. Xcode는 버전 3.1.3입니다.

업데이트: 오, 실제로 속성을 설정하려고하는 것은 당신이 언급 한 오류를 얻는 곳입니다.

    self.myArray = [NSArray arrayWithObject:@"foo"];

분명히 당신은 할 수 없습니다 @synthesize 이 행동은 자신의 접근자를 작성해야합니다.

- (NSArray*)myArray {
    return [NSArray arrayWithArray:myArray];
}
- (void)setMyArray:(NSArray*) pMyArray {
    myArray = [NSMutableArray arrayWithArray:pMyArray];
}

이 액세서를 채우면 메시지가 사라지지 않았으므로 다음에 대한 액세스를 변경해야했습니다.

    [self setMyArray:[NSArray arrayWithObject:@"foo"]];

사용자 정의 액세서없이 위의 구문을 사용하는 것도 작동하지 않았습니다.

추신, 와우, 다른 사람은 메시지 버블이나 빌드 결과 창의 텍스트를 복사 할 수 없다는 것이 화가 났습니까?

따라서 이것은 NSMutableArray를 NSARRAY로 노출시키는 것에 대해 행복하지 않은 @Synthesize 통화와 관련이 있습니다. GetMethod를 구현하지 마십시오.

실제로 그것에 대해 생각하는 것은 행복하지 않은 세트 방법이어야합니다. NSARRAY를 NSMutableARRAY로 설정할 수 없습니다.

귀하의 질문은 다음과 같습니다.

OS 2.2.1과 3.0 사이의 Objective-C 변경 사항을 알고 있습니까?

이러한 변경 사항에 대한 문서가 있습니까?

결정적인 답은 다음과 같습니다.

1) 언어 사양에 의도적 인 변경 사항은 없었지만 컴파일러 및 기타 개발자 도구가 변경되었습니다. Chris와 그의 동료들은 이러한 변화에 대한 전문가입니다.

2) 아마도 어떤 변화가 의도하지 않거나 문서와 동작을 더 잘 일치시키기 위해 만들어 졌기 때문일 것입니다.

Chris의 답변을 "추측"으로 기각하지 않아야합니다. Chris는 Apple의 개발자 도구에서 작업합니다. 더 좋아하는 또 다른 답변을 얻을 수 있지만 더 전문적인 답변을 얻지 못할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top