[objective-c] 시맨틱 이슈 : Property의 합성 게터는 ‘소유 한’객체를 반환하기 위해 Cocoa 명명 규칙을 따릅니다.

현재 iOS 5 SDK를 사용하여 앱을 개발하려고합니다. NSString을 속성으로 만들고 .m 파일에서 합성하려고합니다 (이전에 문제없이 수행했습니다). “의미 적 문제 : 속성의 합성 게터는 ‘소유 한’객체를 반환하기 위해 Cocoa 명명 규칙을 따릅니다.”

이것은 내 코드입니다 : .h

@interface ViewController : UIViewController {
     NSString *newTitle;
}
@property (strong, nonatomic) NSString *newTitle;

.미디엄

@synthesize newTitle;

아무도 내가 이것을 고칠 수있는 단서가 있습니까? 감사!!



답변

내 생각에 사용중인 컴파일러 버전 은 선언 된 속성, 특히 선언 된 속성의 접근 자에 대한 메모리 관리 규칙 을 따릅니다 .

이름이 “alloc”, “new”, “copy”또는 “mutableCopy”로 시작하는 메소드를 사용하여 오브젝트를 작성하면 오브젝트의 소유권을 갖습니다.

newTitle합성시 라는 속성은이라는 메서드를 생성 -newTitle하므로 경고 / 오류가 발생합니다. 속성에 -newTitle대한 getter 메소드 newTitle이지만 이름 지정 규칙은 이름이 시작하는 메소드가 new호출자가 소유 한 오브젝트를 리턴하며 getter 메소드의 경우가 아니라고 명시합니다.

다음을 통해이 문제를 해결할 수 있습니다.

  1. 해당 속성 이름 바꾸기 :

    @property (strong, nonatomic) NSString *theNewTitle;
  2. 특성 이름을 유지하고 특수 메소드 이름 접 두부 중 하나로 시작하지 않는 게터 이름을 지정하십시오.

    @property (strong, nonatomic, getter=theNewTitle) NSString *newTitle;
  3. 속성 이름과 getter 이름을 모두 유지하고 getter 이름이로 시작하더라도 메서드 제품군과 달리 메서드 제품군에 new속 한다고 컴파일러에 알려줍니다 .nonenew

    #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는 결국이 변경 사항을 통합 할 것입니다.


답변

허용되지 않는 개체 이름

  • newButton
  • copyLabel
  • allocTitle

허용 가능한 객체 이름

  • neueButton
  • mCopyLabel
  • _allocTitle

#arc # 자동 합성 # xcode-4.6.1

** 편집하다 **

분명히 mutableCopy 를 사용할 수 없습니다 .


답변

new로 시작하는 멤버의 이름은 경고를 트리거하는 것입니다. 이름을 editedTitle로 변경하면 경고가 사라집니다. 나는 이것을 확인하는 문서를 찾을 수 없었지만 테스트를 통해 ‘new’로 시작하는 멤버 변수가 컴파일러를 악화시키는 지 확인할 수있었습니다.


답변

ARC는 속성 이름에 “New ….”를 사용할 수 없습니다. 그러나 getter 이름을 변경하여 “newTitle”을 사용할 수 있습니다.

@property (nonatomic, strong, getter=theNewTitle) NSString *newTitle;


답변

Bavarious가 제안한 것이 당신이하고 싶었던 것처럼 보이지 않습니다. 인스턴스 변수를 선언 NewTitle하고 속성을 합성하기 만하면됩니다. 예전에는 인스턴스 변수와 속성을 선언해야했습니다. 더 이상은 없어.

이제 올바른 방법은 다음과 같습니다.

.h

@interface ViewController : UIViewController

@property (nonatomic, strong) NSString *newTitle;

.미디엄

@synthesize newTitle = _newTitle; // Use instance variable _newTitle for storage

속성의 인스턴스 변수 newTitle가 합성됩니다. 인스턴스 변수가 속성과 동일하지 않기 때문에 실수하기가 너무 쉽습니다 .

예 : 속성 선언 및 접근 자 합성을 참조하십시오 .


답변

CoreData에서 속성 (일반 컴파일)에 “new …”를 사용하면 “잘못된 액세스”예외와 함께 임의로 충돌합니다.

충돌 로그가 없으며 “All Exceptions Breakpoint”로 표시된 줄이 전혀 도움이되지 않습니다.


답변

속성과 동일한 이름으로 세터를 작성하면이 경고가 제거됩니다.