2011-12-14 4 views
1

私はiOS 4アプリケーションを開発しています。NSMutableDictionaryを__ NSCFStringに変換しました

私はNSMutableDictionaryプロパティを持つクラスがあります。私はここにNSMutableDictionaryことを作成

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

    NSMutableDictionary* cards; 

    ... 
} 

@property (nonatomic, readonly) NSMutableDictionary* cards; 

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

... 
#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; 
    ... 
} 
... 

私が使用するOneCardViewControllerにcardHelper渡します。 OneCardViewControllerに私はcardsからcardを取得しようと

しかし、私はカードがNSMutableDictionaryからNSCFStringに変換していることを取得します。

OneCardViewControllerインタフェース:

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

@property (nonatomic, retain) CardHelper* cardHelper; 

私はここで例外を取得:

- (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]; 
} 

例外がこのラインにスローされます。

currentCard = [cardHelper.cards objectForKey:number]; 

は理由を知っていますか?

答えて

2

変換されていません。割り当てが解除されていて、メモリが別のものに使用されています。

あなたのinitメソッドでは、これらのオブジェクトを保持されていません。

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

ではなく

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

を試してみてください。

1
cards = [NSMutableDictionary dictionaryWithCapacity: kNumCards]; 

これにより、自動リリースされたオブジェクトが作成されます。あなたがもう一度それを呼び出す時には、それは解放され、別のもの、この場合は文字列に割り当てられています。

あなたは辞書を保持または作成する必要が非自動解放1:あなたがオブジェクトを保持していない

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

は、彼らが割り当て解除されていると、ポインタが再利用されている新しいオブジェクトを指していません同じメモリ。

プロジェクトではARC(Automatic Retain Counting)を使用することを検討してください。 ARCでは、コンパイラは保持カウントを処理するので、実際には許されません。現在のプロジェクトを変換するリファクタリングがあります。

あなたのプログラミングの寿命は、ARCでもっと幸せになるはずです。 :-)

関連する問題