2010-04-22 3 views
0

이 상황을 간결하게 처리하는 방법. 내가 제대로 ... if 성명에서퀵 릴리스

NSNumber *pIDAsNumber; 
    ...   
    NSMutableDictionary *contactDictionary = [NSMutableDictionary dictionaryWithDictionary:[defaults dictionaryForKey:kContactDictionary]]; 
    if (!contactDictionary) { 
      contactDictionary = [[NSMutableDictionary alloc] initWithCapacity:1]; 
    } 
    [contactDictionary setObject:pIDAsNumber forKey:[myClass.personIDAsNumber stringValue]]; 
    [defaults setObject:contactDictionary forKey:kContactDictionary]; 

답변

3

보통을 contactDictionary을 발표하고 있지 않다, [NSMutableDictionary dictionaryWithCapacity:1] 대신 ALLOC/초기화를 사용합니다. 그러면 메모리 관리 관점에서 위의 것과 똑같이 작동하는 자동 완성 사전이 생깁니다. 그러나 ...

이 특정 경우에 if 절은 절대로 참이되지 않습니다 (메모리가 부족하여 더 큰 문제가있는 경우 제외). -dictionaryWithDictionary:은 nil이 전달되면 nil이 아닌 빈 사전을 리턴합니다. 따라서 -dictionaryForKey:이 nil을 반환하더라도 -dictionaryWithDictionary:은 추가 할 수있는 빈 변하기 쉬운 사전을 만듭니다.

+1

예. 대신'[[defaults dictionaryForKey : kContactDictionary] mutableCopy]'를 사용해야합니다. –

+1

매개 변수가 0 일 때 동작에 대한 정보를 제공해 주셔서 감사합니다. –

0

-[NSMutableDictionary dictionaryWithDictionary:]은 항상 사전을 반환하기 때문에 if 문을 완전히 삭제할 수 있습니다.

또한 자동 입력 된 비어있는 사전을 얻기 위해 [NSMutableDictionary dictionaryWithCapacity:1]을 사용하지 마십시오. 그냥 [NSMutableDictionary dictionary]을 사용하십시오.