【问题标题】: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 中不使用)。正如你所拥有的那样,你正在泄漏内存。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多