bestsource

의미 문제: 자산의 합성된 getter는 '소유' 객체를 반환하기 위한 코코아 명명 규칙을 따릅니다.

bestsource 2023. 4. 9. 21:48
반응형

의미 문제: 자산의 합성된 getter는 '소유' 객체를 반환하기 위한 코코아 명명 규칙을 따릅니다.

현재 iOS 5 SDK를 사용하여 앱을 개발 중입니다.NSString 속성을 만들고 .m 파일로 합성하려고 합니다(이 작업은 이전에도 문제없이 수행했습니다).자, 저는 이것을 우연히 발견했습니다: "의미적인 문제: 부동산의 합성된 getter는 '소유된' 물건을 돌려주는 코코아 명명 규칙을 따릅니다."

이게 제 코드입니다. .h

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

.m

@synthesize newTitle;

내가 이걸 어떻게 고칠지 아는 사람 있어?감사합니다!!

사용하고 있는 컴파일러 버전은 선언된 속성의 메모리 관리 규칙, 구체적으로는 선언된 속성의 접근자에 대한 메모리 관리 규칙도 따르는 것 같습니다.

이름이 "alloc", "new", "copy" 또는 "mutableCopy"로 시작하는 메서드를 사용하여 개체를 만들 경우 개체의 소유권을 가져옵니다.

「 」라고 하는 이름의 .newTitle를 합성하면 다음과 같은 메서드가 생성됩니다.-newTitle따라서 경고/오류가 발생합니다. -newTitle는 Getter의 입니다.newTitle단, 이 "예"로 되어 있습니다.new는 발신자가 소유한 객체를 반환합니다.겟터

이 문제는 다음 방법으로 해결할 수 있습니다.

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

    @property (strong, nonatomic) NSString *theNewTitle;
    
  2. 속성 이름을 유지하고 특별한 메서드 이름 접두사 중 하나로 시작하지 않는 getter 이름을 지정합니다.

    @property (strong, nonatomic, getter=theNewTitle) NSString *newTitle;
    
  3. 이름을 모두 되지만 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및로서, 성성 이 as 、 고 as 、 as as as as as as as as as as as as as as as as as as as as as as라고 하는 있습니다.-newTitle발신자가 소유한 오브젝트를 반환하지 않는 경우 코드를 읽는 다른 사람에게 혼란을 줄 수 있습니다.


참고로 Apple은 Transitioning to ARC Release Notes를 발행했습니다.이 릴리스 노트에는 다음과 같은 내용이 기재되어 있습니다.

수 .new ★★★★★★★★★★★★★★★★★」copy.

이들은 이미 자신의 진술이 정확하지 않다는 것을 알고 있습니다. 즉, 범인은 속성 이름이 아니라 getter 메서드 이름입니다.


2015년 1월 17일 편집:위의 옵션 3을 제안하는 Clang에 대한 최근 커밋을 방금 알게 되었습니다.objc_method_family(none)은 나중에 될 수 있습니다Xcode에는 최종적으로 이 변경이 반영될 가능성이 있습니다.

허용되지 않는 개체 이름

  • new 버튼
  • copy Label(라벨)
  • allocateTitle(할당제목)

허용 가능한 개체 이름

  • neue 버튼
  • mCopy Label
  • _allocTitle

#code #자동크기 조정 #xcode-4.6.1

** 편집 **

mutable Copy도 사용할 수 없는 것 같습니다.

new로 시작하는 멤버 이름이 경고를 트리거하는 원인입니다.이름을 편집으로 변경하다제목과 경고는 사라집니다.이를 확인하는 문서를 찾을 수 없었지만 테스트를 통해 'new'로 시작하는 멤버 변수가 컴파일러를 악화시킨다는 것을 확인할 수 있었습니다.

ARC에서는 속성 이름에 "New..."를 사용할 수 없습니다.getter 이름을 바꾸면 newTitle을 사용할 수 있습니다.

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

인스턴스 변수 됩니다.NewTitle그런 다음 그 특성을 합성합니다.이전에는 인스턴스 변수와 속성을 선언해야 했습니다.이제 그만.

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

.h

@interface ViewController : UIViewController

@property (nonatomic, strong) NSString *newTitle;

.m

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

" " " "newTitle합성됩니다.인스턴스 변수가 속성과 동일하지 않아야 합니다. 실수하기 쉽습니다.

예시를 참조: 속성 선언 및 접근자 합성

CoreData에서 속성(일반적으로 컴파일)에 "new..."를 사용하면 "bad access" 예외와 함께 랜덤하게 충돌합니다.

크래시 로그는 없으며 "All Exceptions Breakpoint"와 함께 표시된 행은 전혀 도움이 되지 않습니다.

이 경고가 제거된 것과 동일한 이름으로 설정기를 수동으로 작성하면 이 경고가 제거됩니다.

NS_RETURNS_NOT_RETAINED는 명명 문제를 해결하기 위해 사용됩니다.

@property (nonatomic, copy) NSString *newTitle NS_RETURNS_NOT_RETAINED;

정의는 다음과 같습니다.

#define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained))

'ns_returns_not_retained' 속성은 'ns_returns_retained'의 보완입니다.기능 또는 방법이 코코아 규약을 준수하고 보관된 코코아 객체를 반환하는 것처럼 보일 수 있는 경우, 이 속성은 반환된 객체 참조가 발신자에게 반환되는 "소유" 참조로 간주되어서는 안 된다는 것을 나타내기 위해 사용될 수 있다.Foundation 프레임워크는 다음과 같은 기능상 동등한 매크로 NS_RETURNS_NOT_RETING을 정의합니다.

자산 이름 앞에 "new"를 사용할 수 없거나 사용할 수 없는 문제 외에 한 가지 더 말씀드리겠습니다.일반적으로 이름 앞에서는 "새로운"을 피하도록 하세요."New"는 시간에 따라 달라집니다.현재는 새로운 기술이지만, 잠시 후 다시 새로운 기술을 도입하고 싶을 수도 있습니다.그래서 이름에 "new"를 사용하는 것은 항상 좋지 않습니다.이렇게 생각해 보세요.프로그래밍 세계에서는 '새로운'이 항상 무언가를 창조하고 있습니다.즉, 어떤 새로운 예를 들 수 있습니다.

다른 제목을 할당하려는 경우 현재 이름을 특성 제목대체로 지정합니다.

한가지 더:setSomething 또는 getSomething과 같은 동사로 함수 및 메서드의 이름을 먼저 지정하십시오.단, 속성에서는 heightMinimum, heightMaximum 등 오브젝트의 이름을 먼저 붙이려고 합니다.-> 코드화할 때 인스펙터를 사용하면 항상 오브젝트를 찾습니다.시험해 보세요.;-)

이것을 시험해 보세요:-

@property (nonatomic,retain) NSString *newTitle;

언급URL : https://stackoverflow.com/questions/6327448/semantic-issue-propertys-synthesized-getter-follows-cocoa-naming-convention-fo

반응형