2012-10-19 2 views
6

나는 내 프로젝트에 문제가 있었다 과 같이, 사용 :아이폰 OS, NSMutableDictionary

:이했을 때

DataDict = [[NSMutableDictionary alloc]init]; 

것은 지금, 나는이 사전에 무언가를 추가하려고 분은이 오류 메시지를 얻을 것 16,

- [__ NSDictionaryI의 setObject : forKey :] : 51 : 56.040 테스트 [2297 : C07] 미정 선택기 인스턴스 0x885ae60 2012년 10월 19일 (16)에 전송 애플리케이션을 종료 * 의한 캐치되지 않는 예외 'NSInvalidArgumentException'에 이유 : '- [__ NSDictionaryI 의 setObject : forKey :] : 인식 할 수없는 선택 예를 0x885ae60로 전송'잠시 후 내 프로젝트를 통해 천 번을 실행

, 내가 지금처럼, 내 초기화 행의 주석을 해제하기로 결정

//DataDict = [[NSMutableDictionary alloc]init]; 

그리고 문제가 해결되었습니다.

제 질문은 : 이유가 무엇입니까?

답변

15

문제는 귀하의 속성을 정의한 방식입니다. 당신이 그것을 변경하는 경우 :

@property (strong, nonatomic) NSMutableDictionary *DataDict ; 

대신 copy 아무런 문제 될 것이 없다.

기본적으로 생성 된 접근자를 통해 객체 사본을 얻으려는 것으로 이는 대체로 NSDictionary (불변 사본)을 반환하기 때문에 발생합니다.

자세한 내용은 objective-c properties here에서 찾을 수 있습니다.

객관적인 -c ivars는 대개 소문자로 시작합니다 (대문자는 클래스에 사용됩니다). dataDictDataDict보다 우선되어야합니다.

+0

감사합니다. – Kalamantina

+0

그렇다면 참조를 강하게 만들고 init을 할당해야합니까? 또는 init을 할당 할 필요가 없도록 강력하게 만들 수 있습니까? – Kalamantina

+0

'강력한'상태로 만들면 해당 객체와 강력한 관계를 유지하기를 원한다는 의미입니다. 기본적으로 소유자가 할당을 해제 할 때 할당을 해제하려고 함을 의미합니다. 항상 객체를 할당/초기화해야합니다. – Alladinian

2

NSMutableDictionary 인스턴스 alloc/init-ed가 "copy"메서드를 사용하여 "copy"되고 NSMutableDictionary가 아니라 NSDictionary를 "copy"메서드가 만들도록 속성에 "copy"특성이 있기 때문입니다. ("mutableCopy"는 NSMutableDictionary를 생성합니다).

아마, "복사"대신 "보유"를 속성으로 사용할 수 있습니다.

@property (retain, nonatomic) NSMutableDictionary *DataDict ; 

또는 "복사"/ "보관"하지 않고 ARC를 사용합니다 (자동 참조 계산).