내 생각에 사용중인 컴파일러 버전 은 선언 된 속성, 특히 선언 된 속성의 접근 자에 대한 메모리 관리 규칙 을 따릅니다 .
이름이 "alloc", "new", "copy"또는 "mutableCopy"로 시작하는 메소드를 사용하여 오브젝트를 작성하면 오브젝트의 소유권을 갖습니다.
newTitle
합성시 라는 속성은이라는 메서드를 생성 -newTitle
하므로 경고 / 오류가 발생합니다. 속성에 -newTitle
대한 getter 메소드 newTitle
이지만 이름 지정 규칙은 이름이 시작하는 메소드가 new
호출자가 소유 한 오브젝트를 리턴하며 getter 메소드의 경우가 아니라고 명시합니다.
다음을 통해이 문제를 해결할 수 있습니다.
해당 속성 이름 바꾸기 :
@property (strong, nonatomic) NSString *theNewTitle;
특성 이름을 유지하고 특수 메소드 이름 접 두부 중 하나로 시작하지 않는 게터 이름을 지정하십시오.
@property (strong, nonatomic, getter=theNewTitle) NSString *newTitle;
속성 이름과 getter 이름을 모두 유지하고 getter 이름이로 시작하더라도 메서드 제품군과 달리 메서드 제품군에 new
속 한다고 컴파일러에 알려줍니다 .none
new
#ifndef __has_attribute
#define __has_attribute(x) 0 // Compatibility with non-clang compilers
#endif
#if __has_attribute(objc_method_family)
#define BV_OBJC_METHOD_FAMILY_NONE __attribute__((objc_method_family(none)))
#else
#define BV_OBJC_METHOD_FAMILY_NONE
#endif
@interface ViewController : UIViewController
@property (strong, nonatomic) NSString *newTitle;
- (NSString *)newTitle BV_OBJC_METHOD_FAMILY_NONE;
@end
이 솔루션을 사용하면 newTitle
속성 이름과 게터 이름을 모두 유지할 -newTitle
수 있지만 호출자가 소유 한 객체를 반환하지 않는 메서드를 호출 하면 코드를 읽는 다른 사람들에게 혼란을 줄 수 있습니다.
기록을 위해 애플은 ARC 릴리즈 노트로의 전환을 발표했다 .
속성으로 new
또는로 시작하는 이름을 지정할 수 없습니다 copy
.
그들은 이미 그들의 진술이 정확하지 않다는 통보를 받았습니다. 범인은 속성 이름이 아닌 게터 메소드 이름입니다.
편집 2015 년 1 월 17 일 : 방금 속성 이름이 특수 메소드 패밀리 접두사 중 하나와 일치하는 일반적인 경우에 대해 수정을 포함 하여 위의 옵션 3을 제안 하는 Clang에 대한 최근 커밋을 보았습니다 objc_method_family(none)
. Xcode는 결국이 변경 사항을 통합 할 것입니다.