Проблемы с NSMutableArray Init - PullRequest
2 голосов
/ 18 августа 2011

У меня есть этот метод, имеющий дело с парным массивом, который я не могу понять, правильноНечто связанное с 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];
}

Ответы [ 2 ]

5 голосов
/ 18 августа 2011

Вы правы - это ваше использование 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 не используется в Какао). Как у вас, у вас течет память.

1 голос
/ 18 августа 2011
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добавить в закладки, так как вы создаете его с помощью нового ..

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, вы должны изучитьчто первый ..

...