에는 질문이 있습니다. "NSMutableArray 속성을 사용하여 복사 할 수있는 이유는 무엇입니까?"답변을 검색했지만 자동 생성기의 getter setter 코드를보고 싶습니다. 할 수 있을까요?어떻게 objective-c의 속성을 조회 할 수 있습니까? @synthesize getter setter 코드
답변
setter의 Obj-C 코드는 어셈블러에서만 볼 수 없습니다. 먼저 Xcode에서 속성이 들어있는 소스 파일을 선택한 다음 Produce > Perform Action > Assemble "File.m"
메뉴 항목을 선택합니다. 그러면 어셈블리 코드가 들어있는 창이 열립니다. setPropertyName:
을 검색하십시오. PropertyName
은 귀하의 재산의 대문자 이름입니다.
설정자에게 _objc_setProperty_nonatomic_copy
또는 _objc_setProperty_atomic_copy
이 표시됩니다. 디버거를위한 코드를 보려면 디버거를 사용하고 디버거에 들어가야합니다. 본질적으로 전화는 copyWithZone:
입니다.
면접 질문 뒤에 이유가 더 중요합니다. 위와 같이 간단한 실험 또는 어셈블러를 통해 파기하면 copy
속성 속성이 항상 copy
이고, mutableCopy
이 아니라는 것을 알 수 있습니다. 그래서 선언은 :
@property (nonatomic, copy) NSMutableArray *shouldBeInvalid;
이상한 세계에서는 컴파일러 오류가 발생합니다. 당신이 속성에 변경 가능한 배열 값을 할당하는 경우 : 다음
self.shouldBeInvalid = @[ @24 ].mutableCopy;
을 인해 copy
에 실제로 할당 된 값은 NSMutableArray
선언 된 유형 모순 불변 배열 (NSArray
)입니다. 당신은 또한을 찾을 수 있습니다
... 재산의 가치가 선언 된 유형에 대한 불변의 객체 반하는로
[self.shouldBeInvalid addObject:@42];
는 런타임 오류가 발생합니다 : 변경 가능한 배열로 나중에 속성 값을 사용하려고 컴파일러는 속성에 변경할 수없는 배열을 할당 할 수 있습니다.
self.shouldBeInvalid = @[ @24 ];
경고없이.
면접관이 찾고자했던 것은 부동산에 대해 copy
+ 변경할 수있는 유형이 Objective-C에서 의미가 없다는 것을 설명하는 것이 었습니다. 사본에 불변의 개체 값이 생성되기 때문입니다. 그러나 copy
및 변경할 수없는 개체 유형 (NSArray
, NSDictionary
등)이있는 속성은 변경 가능한 개체 값이 할당되면 변경할 수없는 복사본이 만들어져 속성 값이 예기치 않게 변경되는 것을 방지합니다.:
@property (nonatomic) NSArray *shouldHaveCopy;
NSMutableArray *sample = @[ @"oops" ].mutableCopy;
self.shouldHaveCopy = sample;
[sample addObject:@"'immutable' property changed"];
// self.shouldHaveCopy now references a two element array despite
// its type being `NSArray`
그래서 일반적인 규칙은 다음과 같습니다
- 변경 가능한 객체의 값을 가지도록 구성 속성을 (
NSMutableDictionary
등)copy
를 지정해서는 안됩니다; 및 - 해당 변경 가능한 개체 하위 클래스 (예 :
NSArray
의 경우NSMutableArray
등)가있는 경우 변경할 수없는 개체 값을 갖는 속성은 항상copy
을 지정해야합니다. 불변의`NSArray`을 반환 copy`
HTH
"생산> 작업 수행> 파일 m 조립"을 수행하면 Xcode 충돌이 발생합니다. 프로세스 : Xcode [6985] 경로 : /Applications/Xcode.app/Contents/MacOS/Xcode 식별자 : com.apple.dt.Xcode 버전 : 9.0 (13247) 빌드 정보 : IDEFrameworks-13247000000000000 ~ 26 코드 종류 : X86-64 (기본) 부모 프로세스 : ??? [1] 책임 : 엑스 코드 [6985] 사용자 ID : 501 날짜/시간 : 2017년 12월 8일 20 : 08 : 52.685 0800 OS 버전 : 맥 OS X 10.12.6 (16G1108) 보고서 버전 : 12 – chengxcv5
Xcode를 다시 시작한 후에는 문제가 해결되지 않는 경우가 종종 있습니다 .- 특정 프로젝트에 문제가 계속 발생하면 Xcode를 다시 시작한 후 문제가 해결됩니다. 옵션 키를 누른 상태에서'Project> Clean Build Folder'를 선택하여 수정했는지 확인하십시오. HTH – CRD
@CRD 설명은 완벽하게 유효 합니다만,'NSObject'의'mutableCopy' (그리고'copy')) 메소드는 프로퍼티로 정의되지 않는다. 그들을 호출하기 위해'.syntax'를 사용하는 것은 그 반대를 제안한다. –
정말 소스 코드를 볼 수 없습니다. Xcode의 디버거에서이 단계로 들어가서 어셈블러 버전을 볼 수 있습니다.이 어셈블러 버전은 플랫폼의 어셈블러를 알고 있거나 영어 단어의 약어를 추측하는 데 능숙한 경우 합리적으로 읽을 수 있습니다.
'. 'mutableCopy'는 복사 된 NSMutableArray를 반환합니다. 속성을'copy'로 선언하면 요소에 액세스 할 수 있지만 명시 적으로 setter를 호출하지 않으면 내부 구조를 변경할 수 없습니다. 기본적으로 복사 속성이있는 정확한 이유입니다. 기술적으로 모든 NSMutableArray 속성은 디자인이 나쁘지 않은 한'copy'이어야합니다. – Sulthan