1
我讀過很多關於SO的錯誤消息,但是沒有一個解決方案適用於我的情況。所以請在推薦其他帖子前閱讀代碼。提前致謝。NSMutableDictionary錯誤:發送給不可變對象的變異方法
我設置例外破發點,發現問題存在於[self.countryNameDictionary setObject:array forKey:initial];
在AppDelegate.h
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@property (nonatomic,copy) NSMutableDictionary *countryNameDictionary;
@property (nonatomic,copy) NSMutableArray *countryNameInitials;
@end
在AppDelegate.m
#import "AppDelegate.h"
@implementation AppDelegate
@synthesize window = _window;
@synthesize countryNameDictionary = _countryNameDictionary;
@synthesize countryNameInitials = _countryNameInitials;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSMutableArray *permanentArray = [[NSMutableArray alloc]init];
self.countryNameDictionary = [[NSMutableDictionary alloc]init];
self.countryNameInitials = [[NSMutableArray alloc]init ];
[[NSUserDefaults standardUserDefaults] setObject:@"YES" forKey:@"isFirstLaunch"];
// run this code only once by creating and checking a user defaults key
if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"isFirstLaunch"] isEqualToString:@"YES"])
{
// locate and convert txt file to string
NSString *path = [[NSBundle mainBundle] pathForResource:@"country_name" ofType:@"txt"];
NSString *string = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
// seperate string into array
permanentArray = [[string componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]mutableCopy];
// strip white space string
permanentArray = [[permanentArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF != ''"]]mutableCopy];
// enumerate a-z to set the two global variables
for (int asciicode =65; asciicode<=90; asciicode++)
{
NSString *initial = [NSString stringWithFormat:@"%c",asciicode];
self.countryNameInitials = [NSMutableArray arrayWithObject:initial];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF BEGINSWITH[cd] %@",initial];
NSMutableArray *array = [[permanentArray filteredArrayUsingPredicate:predicate]mutableCopy];
// populate the dictionary with initial-country-names pair
[self.countryNameDictionary setObject:array forKey:initial]; // PROBLEM IS HERE
NSLog(@"self.countrynameDictionary is %@",self.countryNameInitials);
}
// set to a non-nil value
[[NSUserDefaults standardUserDefaults] setObject:@"NO" forKey:@"isFirstLaunch"];
}
return YES;
}
@ Philip007請參閱[this](http://stackoverflow.com/q/816720/730701),瞭解如何處理可變對象作爲屬性。 – Adam