2017-12-07 4 views
0
면접의

에는 질문이 있습니다. "NSMutableArray 속성을 사용하여 복사 할 수있는 이유는 무엇입니까?"답변을 검색했지만 자동 생성기의 getter setter 코드를보고 싶습니다. 할 수 있을까요?어떻게 objective-c의 속성을 조회 할 수 있습니까? @synthesize getter setter 코드

+0

'. 'mutableCopy'는 복사 된 NSMutableArray를 반환합니다. 속성을'copy'로 선언하면 요소에 액세스 할 수 있지만 명시 적으로 setter를 호출하지 않으면 내부 구조를 변경할 수 없습니다. 기본적으로 복사 속성이있는 정확한 이유입니다. 기술적으로 모든 NSMutableArray 속성은 디자인이 나쁘지 않은 한'copy'이어야합니다. – Sulthan

답변

2

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

+0

"생산> 작업 수행> 파일 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

+0

Xcode를 다시 시작한 후에는 문제가 해결되지 않는 경우가 종종 있습니다 .- 특정 프로젝트에 문제가 계속 발생하면 Xcode를 다시 시작한 후 문제가 해결됩니다. 옵션 키를 누른 상태에서'Project> Clean Build Folder'를 선택하여 수정했는지 확인하십시오. HTH – CRD

+0

@CRD 설명은 완벽하게 유효 합니다만,'NSObject'의'mutableCopy' (그리고'copy')) 메소드는 프로퍼티로 정의되지 않는다. 그들을 호출하기 위해'.syntax'를 사용하는 것은 그 반대를 제안한다. –

0

정말 소스 코드를 볼 수 없습니다. Xcode의 디버거에서이 단계로 들어가서 어셈블러 버전을 볼 수 있습니다.이 어셈블러 버전은 플랫폼의 어셈블러를 알고 있거나 영어 단어의 약어를 추측하는 데 능숙한 경우 합리적으로 읽을 수 있습니다.