【问题标题】:NSMutableArray Init troublesNSMutableArray 初始化问题
【发布时间】:2011-10-29 12:14:53
【问题描述】:
我有这个方法处理几个我似乎无法正确处理的数组。与 alloc 和 init 相关的东西。
- (void)addBookmark
{
// Get the user defaults object
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
// Load your bookmarks (editable array)
NSMutableArray *bookmarks = [[NSMutableArray alloc]init];
NSArray *bookmarksLoaded = [userDefaults arrayForKey:@"bookmarks"];
if (bookmarksLoaded != nil) {
[bookmarks initWithArray:bookmarksLoaded];
} else {
[bookmarks init];
}
// Add a bookmark
NSMutableDictionary *bookmark = [NSMutableDictionary new];
[bookmark setValue:@"value" forKey:@"name"];
[bookmark setValue:@"value" forKey:@"description"];
[bookmark setValue:@"value" forKey:@"code"];
[bookmarks addObject:bookmark];
// Save your (updated) bookmarks
[userDefaults setObject:bookmarks forKey:@"bookmarks"];
[userDefaults synchronize];
// Memory cleanup
[bookmarks release];
}
【问题讨论】:
标签:
ios
objective-c
cocoa-touch
nsmutablearray
nsarray
【解决方案1】:
NSMutableArray *bookmarks = [[NSMutableArray alloc]init];
NSArray *bookmarksLoaded = [userDefaults arrayForKey:@"bookmarks"];
if (bookmarksLoaded != nil) {
[bookmarks initWithArray:bookmarksLoaded];
} else {
[bookmarks init];
}
上面代码的问题是你到处都在初始化书签。目标 C 中的任何对象都必须初始化一次。我将把你的代码重写为
NSMutableArray *bookmarks = nil;
NSArray *bookmarksLoaded = [userDefaults arrayForKey:@"bookmarks"];
if (bookmarksLoaded != nil) {
bookmarks = [[NSMutableArray alloc] initWithArray:bookmarksLoaded];
} else {
bookmarks = [[NSMutableArray alloc] init];
}
此外,您必须释放 NSMutableDictionary 书签,因为您是通过 new.. 来创建它的。
NSMutableDictionary *bookmark = [NSMutableDictionary new];
[bookmark setValue:@"value" forKey:@"name"];
[bookmark setValue:@"value" forKey:@"description"];
[bookmark setValue:@"value" forKey:@"code"];
[bookmarks addObject:bookmark];
[bookmark release];
另外,从代码中可以看出你还没有掌握iphone的内存管理..要成为一名成功的iOS开发者,你必须先学习..
【解决方案2】:
你是对的 - 这是你对 alloc/init 的使用。您应该只 init 一个对象一次。你想要这样的东西:
// Load your bookmarks (editable array)
NSMutableArray *bookmarks = nil; // we'll initialize it later
NSArray *bookmarksLoaded = [userDefaults arrayForKey:@"bookmarks"];
if (bookmarksLoaded) { // shortcut for bookmarksLoaded != nil
bookmarks = [[NSMutableArray alloc] initWithArray:bookmarksLoaded];
} else {
bookmarks = [[NSMutableArray alloc] init];
}
// Add a bookmark
NSMutableDictionary *bookmark = [NSMutableDictionary dictionary];
如果您使用dictionary 而不是new,您将获得一个您不必担心的自动释放对象(new 在 Cocoa 中不使用)。正如你所拥有的那样,你正在泄漏内存。