오류 : 쓰기 가능한 원자 속성이 합성 된 setter / getter와 사용자 정의 setter / getter를 쌍으로 연결할 수 없습니다
최근에 오래된 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
{
//..
}
오류가 생성되는 이유를 알 수 있습니다. 컴파일러에 내 속성 접근자를 합성하도록 지시 한 다음 (getter 및 setter) 즉시 setter를 수동으로 재정의합니다. 그 코드는 항상 약간 냄새가났다.
그렇다면 이것을 수행하는 올바른 방법은 무엇입니까? @dynamic
대신에 사용 @synthesize
하면 getter도 작성해야합니다. 그게 유일한 방법인가요?
나는 같은 문제가 있었고 약간의 연구를 한 후에이 문제에 대한 결론을 내 렸습니다.
컴파일러는 @property
원자로 선언 한 nonatomic
키워드 에 대해 경고 하지만 키워드 를 생략하면 해당 속성에 대한 액세스를 동기화하는 방법이 불완전하게 구현됩니다.
그 경고를 사라지게하려면 :
a @property
를 원자로 선언 하면 다음 중 하나를 수행하십시오.
- 사용
@dynamic
또는; @synthesize
합성 된 세터 및 게터를 사용 및 유지하거나;- 의 수동 구현을 제공 모두 세터와 (상기 지시자를 사용하지 않음)을 게터.
@property
with (nonatomic)
를 선언하면 getter 및 setter의 수동 및 합성 구현을 혼합 할 수 있습니다.
업데이트 : 속성 자동 합성에 대한 참고 사항
LLVM 4.0부터 CLang은 선언되지 않은 속성에 대해 자동 합성을 제공합니다 @dynamic
. 기본적으로를 제외하더라도 @synthesize
컴파일러는 getter 및 setter 메소드를 제공합니다. 그러나, 원자 속성에 대한 규칙은 여전히 동일합니다 : 하나는 컴파일러가 제공하자 모두 게터와 세터를, 또는 그 구현 모두에게 자신을!
getter도 구현해야합니다. 예:
// 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;
}
"객관적 C 사용자 정의 특성"을 검색하면 얻을 수있는 다른 인기 항목 중에서이 질문은 "setter ="또는 "getter ="에 대한 정보로 업데이트되지 않습니다.
따라서이 질문에 대한 자세한 정보를 제공하려면
당신은 서면으로 자신의 방법으로 @property 호출을 제공 할 수 있습니다
@property(setter = MySetterMethod:, getter = MyGetterMethod)
제공된 setter 메소드의 콜론을 확인하십시오.
Reference Apple documentation
EDIT: I'm not quite sure how the new changes to Objective-C's properties (they are much more intelligent now) change the answers to this question. Perhaps it should all be marked as out of date.
For others who are getting this error not for the reason OP described, you likely have the same issue as me:
You have a @property with the same name as a -()method.
Something like this:
@property UIView *mainView;
-(UIView *)mainView;
'IT' 카테고리의 다른 글
Swift의 펜촉에서 사용자 정의 UITableViewCell (0) | 2020.07.05 |
---|---|
Visual Studio 2017-Node.JS 서버 프로세스-해제 하시겠습니까? (0) | 2020.07.05 |
리눅스에서 빈 폴더를 나열하는 방법 (0) | 2020.07.05 |
내 GIT 하위 모듈 HEAD가 마스터에서 분리 된 이유는 무엇입니까? (0) | 2020.07.05 |
자바 스크립트에서 선택적 매개 변수 처리 (0) | 2020.07.05 |