programing

오류: 쓰기 가능한 원자 속성은 합성된 세터/게터와 사용자 정의 세터/게터를 쌍으로 구성할 수 없습니다.

lastmemo 2023. 5. 11. 23:57
반응형

오류: 쓰기 가능한 원자 속성은 합성된 세터/게터와 사용자 정의 세터/게터를 쌍으로 구성할 수 없습니다.

저는 최근에 오래된 Xcode 프로젝트를 컴파일하려고 했는데(예전에는 잘 컴파일되어 있었지만), 지금은 이런 형식의 오류가 많이 발생하고 있습니다.

error: writable atomic property 'someProperty' cannot pair a synthesized setter/getter with a user defined setter/getter

이러한 오류의 원인이 되는 코드 패턴은 항상 다음과 같습니다.

// Interface:

@property (retain) NSObject * someProperty;

// Implementation:

@synthesize someProperty; // to provide the getter
- (void)setSomeProperty:(NSObject *)newValue
{
    //..
}

오류가 발생하는 이유를 알 수 있습니다.컴파일러에게 내 속성 접근자(게터와 세터 모두)를 합성하라고 한 다음, 즉시 세터를 수동으로 재정의합니다.그 코드는 항상 약간 이상한 냄새가 나요.

그렇다면, 이것을 하는 적절한 방법은 무엇일까요?사용할 경우@dynamic@synthesize저도 더 좋은 글을 써야 할 것입니다.그게 유일한 방법입니까?

저도 같은 문제가 있었고 약간의 조사를 한 후, 이 문제에 대한 제 결론은 다음과 같습니다.

에 대해 합니다.@property당신이 원자력으로 선언한 것(즉, 생략함으로써.nonatomic키워드), 그러나 해당 속성에 대한 액세스를 동기화하는 방법에 대한 불완전한 구현을 제공합니다.

해당 경고를 사라지게 하는 방법

다음을 선언하는 경우@property원자가 되려면 다음 중 하나를 수행합니다.

  • 사용하다@dynamic또는;
  • 사용하다@synthesize합성된 세터와 게터를 유지합니다;
  • 위의 지침 중 하나를 사용하지 않고 세터와 게터를 모두 수동으로 구현합니다.

를 하면,@property와 함께(nonatomic)그런 다음 수동 및 합성된 게터 및 세터 구현을 혼합할 수 있습니다.

부동산 자동 합성에 관한 최신 정보

4은 LLVM 4.0이 자동 기능을 합니다.@dynamic기본적으로, 당신이 그것을 생략하더라도.@synthesize컴파일러는 당신에게 게터와 세터 메소드를 제공할 것입니다.그러나 원자 속성에 대한 규칙은 여전히 동일합니다.컴파일러가 getter와 setter를 모두 제공하도록 하거나 직접 구현하십시오!

당신은 또한 게터를 구현할 필요가 있습니다.예:

// Interface:

@property (retain) NSObject * someProperty;

// Implementation:

- (void)setSomeProperty:(NSObject *)newValue
{
    @synchronized (self)
    {
        // ...
    }
}

- (NSObject *)someProperty
{
    NSObject *ret = nil;

    @synchronized (self)
    {
        ret = [[someProperty retain] autorelease];
    }

    return ret;
}

이 질문은 "custom C 속성"을 검색하여 얻을 수 있는 다른 상위 항목 중에서 "setter =" 또는 "getter ="에 대한 정보로 업데이트되지 않습니다.

이 질문에 대한 자세한 내용은 다음과 같습니다.

@property 호출은 다음과 같이 작성하여 사용자 고유의 메서드와 함께 제공할 수 있습니다.

    @property(setter = MySetterMethod:, getter = MyGetterMethod)

제공된 세터 방법에 대한 콜론을 확인합니다.

Apple 문서 참조

편집: 목표-C의 속성에 대한 새로운 변경 사항(지금은 훨씬 지능적임)이 이 질문에 대한 대답을 어떻게 변화시키는지 잘 모르겠습니다.아마도 그것은 모두 구식으로 표시되어야 할 것입니다.

OP가 설명한 이유 때문이 아니라 이 오류가 발생하는 다른 사람들도 저와 같은 문제가 있을 수 있습니다.

-() 메서드와 이름이 같은 @property가 있습니다.

이와 같은 것:

@property UIView *mainView;

-(UIView *)mainView;

언급URL : https://stackoverflow.com/questions/3227176/error-writable-atomic-property-cannot-pair-a-synthesized-setter-getter-with-a-u

반응형