2011-12-14 5 views
1

iOS 4 응용 프로그램을 개발 중입니다.NSMutableDictionary를 __ NSCFString으로 변환했습니다.

은 내가 NSMutableDictionary 속성 클래스가 있습니다

@interface CardHelper : NSObject <NSXMLParserDelegate>{ 
    ... 

    NSMutableDictionary* cards; 

    ... 
} 

@property (nonatomic, readonly) NSMutableDictionary* cards; 

- (id)initWithXMLFile:(NSString *)xmlFileName andLanguage:(NSString *)language; 
... 

을 내가 만드는 것이 여기 NSMutableDictionary :

... 
#define kNumCards 22 
... 

- (id)initWithXMLFile:(NSString *)xmlFileName andLanguage:(NSString *)language 
{ 
    if (self = [super init]) 
    { 
     userLanguage = [NSString stringWithString:language]; 

     cards = [NSMutableDictionary dictionaryWithCapacity: kNumCards]; 

     [self parseXMLFile:[self GetResourcePathFor:xmlFileName OfType:@"xml"]]; 

     return self; 
    } 
    else 
     return nil; 
} 

그리고 난 여기에 요소를 추가 :

- (void) parser:(NSXMLParser *)parser 
    didEndElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI 
    qualifiedName:(NSString *)qName 
{ 
    NSLog(@"DidEndElement: %@", elementName); 
    if ([elementName isEqualToString:@"card"]) 
    { 
     [cards setObject:currentCard forKey:currentCard.Number]; 
     [currentCard release]; 
     currentCard = nil; 

     return; 
    } 

    ... 
} 

CardHelper 객체를 ViewController (내 응용 프로그램의 기본보기 컨트롤러)라는 클래스에 만들어집니다. 의 ViewController에 정의

- (IBAction)oneCardCliked:(id)sender 
{ 
    oneViewController = [[OneCardViewController alloc] init]; 
    oneViewController.cardHelper = cardHelper; 

    [self presentModalViewController:oneViewController animated:YES]; 
} 

CardHelper :

@interface ViewController : UIViewController { 
    ... 
    CardHelper* cardHelper; 
    ... 
} 
... 

내가 cardHelper가 사용하는 OneCardViewController에 전달이보기 컨트롤러에서 나는 또 다른 하나를 보여줍니다.

는하지만, OneCardViewController에 나는 카드 NSMutableDictionary에서 NSCFString로 변환 것을 얻을 cards에서 card를 얻을하려고합니다.

OneCardViewController 인터페이스 :

@interface OneCardViewController : UIViewController { 
    CardHelper* cardHelper; 
    ... 
} 

@property (nonatomic, retain) CardHelper* cardHelper; 

나는 여기에 예외가 :

currentCard = [cardHelper.cards objectForKey:number]; 

당신은 이유를 알고 있습니까 : 예외가이 라인에서 발생합니다

- (void) setUpTarotGame 
{ 
    int arcaneNumber; 
    arcaneNumber = [cardHelper GenerateArcaneNumber]; 
    NSString* number = [NSString stringWithFormat:@"%d", arcaneNumber]; 
    if (cardHelper == nil) { 
     NSLog(@"cardHelper nil"); 
     return; 
    } 
    if (cardHelper.cards == nil) 
    { 
     NSLog(@"cards nil"); 
     return; 
    } 
    else 
     NSLog(@"cards count = %d", [cardHelper.cards count]); 
    currentCard = [cardHelper.cards objectForKey:number]; 

    [self setCardImageWithArcane:arcaneNumber]; 
} 

?

답변

2

변환되지 않고 할당 해제되고 메모리가 다른 용도로 사용되고 있습니다. 당신의 init 메소드에서

당신은 이러한 개체를 유지되지 않습니다

userLanguage = [NSString stringWithString:language]; 
cards = [NSMutableDictionary dictionaryWithCapacity: kNumCards]; 

대신

userLanguage = [language copy]; 
cards = [NSMutableDictionary alloc] initWithCapacity:kNumCards]; 

을보십시오.

1
cards = [NSMutableDictionary dictionaryWithCapacity: kNumCards]; 

이는 오토 릴리즈 개체를 만듭니다. 당신이 그것을 다시 부를 때까지, 그것은 다른 것으로 풀려 났고,이 경우 문자열로 지정되었습니다.

당신은 사전을 유지하거나 만들 필요가 비 오토 릴리즈 하나 : 당신은 객체를 유지하지 않는

cards = [[NSMutableDictionary alloc] initWithCapacity:kNumCards]; 
2

, 그들은 해제되고 있으며, 포인터가 다시 사용하는 새로운 객체를 가리키는되지 않습니다 같은 기억.

프로젝트에 대해 ARC (Automatic Retain Counting)를 사용해보십시오. ARC를 사용하면 컴파일러가 보유 개수를 관리하므로 실제로 그렇게 할 필요가 없습니다.현재 프로젝트를 변환 할 리팩토링이 있습니다.

프로그래밍 수명은 ARC로 훨씬 더 행복해야합니다. :-)

관련 문제