NSMutableDictionary 转换成 __ NSCFString
Posted
技术标签:
【中文标题】NSMutableDictionary 转换成 __ NSCFString【英文标题】:NSMutableDictionary converted into __ NSCFString 【发布时间】:2011-12-14 10:57:27 【问题描述】:我正在开发一个 ios 4 应用程序。
我有一个具有 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(我的应用程序的主视图控制器)的类上创建的。在这个视图控制器中,我展示了另一个:
- (IBAction)oneCardCliked:(id)sender
oneViewController = [[OneCardViewController alloc] init];
oneViewController.cardHelper = cardHelper;
[self presentModalViewController:oneViewController animated:YES];
在 ViewController 中定义的 CardHelper:
@interface ViewController : UIViewController
...
CardHelper* cardHelper;
...
...
我将 cardHelper 传递给 OneCardViewController 以便在那里使用。
但是,在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];
你知道为什么吗?
【问题讨论】:
【参考方案1】:它没有被转换,它正在被释放,内存被用于其他用途。
在您的 init 方法中,您没有保留这些对象:
userLanguage = [NSString stringWithString:language];
cards = [NSMutableDictionary dictionaryWithCapacity: kNumCards];
试试
userLanguage = [language copy];
cards = [NSMutableDictionary alloc] initWithCapacity:kNumCards];
改为。
【讨论】:
【参考方案2】:您没有保留对象,它们正在被释放,并且指针没有指向重新使用相同内存的新对象。
考虑为您的项目使用 ARC(自动保留计数)。使用 ARC,编译器会处理保留计数,因此您不必这样做,实际上也不允许这样做。有一个重构将转换当前项目。
有了 ARC,您的编程生活应该会更快乐。 :-)
【讨论】:
【参考方案3】:cards = [NSMutableDictionary dictionaryWithCapacity: kNumCards];
这会创建一个自动释放的对象。当你再次调用它时,它已经被释放并分配给其他东西,在这种情况下是一个字符串。
您必须保留字典或创建非自动发布的字典:
cards = [[NSMutableDictionary alloc] initWithCapacity:kNumCards];
【讨论】:
以上是关于NSMutableDictionary 转换成 __ NSCFString的主要内容,如果未能解决你的问题,请参考以下文章
iOS NSMutableDictionary中UIImage的存储和读取
使用 NSJSONSerialization 将 NSMutableDictionary 转换为 JSON 会返回不同的结果
无法将“NSMutableDictionary”类型的值转换为预期的参数类型“[String: AnyObject]?”
无法将类型“NSMutableDictionary”的值转换为强制类型“[NSObject: AnyObject]”以用于 google ios Analytics