2009-09-14 3 views
5

У меня есть тест маленький инструмент фундамент (Objective-C), что я играл с и у меня есть несколько вопросов ...Добавление строковых объектов в NSMutableArray?

#import <Foundation/Foundation.h> 

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    int planetLoop; 
    NSString *tempString; 
    NSMutableArray *planetArray = [[NSMutableArray alloc] init]; 

    NSLog(@"STRING ARRAY ... Start"); 
    for(planetLoop=0; planetLoop<10; planetLoop++) { 
     tempString = [NSString stringWithFormat: @"Planet_%03d", planetLoop+1]; 
     NSLog(@"Planet_%03d", planetLoop+1); 
     [planetArray addObject:tempString]; 
    } 

    [planetArray release]; 
    [pool drain]; 
    return 0; 
} 

Во-первых, как правило, я освобождаю объект после добавления его в массив, но я прав, думая, что то, что у меня есть в настоящее время, является правильным, потому что «tempString» является строковым литералом, и поэтому его не нужно выделять или выпускать?

Во-вторых, когда я запускаю это (до выполнения), я получаю следующий eror «неспособный прочитать неизвестную команду загрузки 0x80000022», если это проблема с моим кодом? от поиска в google, похоже, это может быть ошибка в xCode 3.1.2, у кого есть идеи?

Наконец все, что я делаю неправильно, идея заключается в том, чтобы заполнить массив с 10 строки «Planet_001» до «Planet_010»

EDIT: Ах, я вижу, вот из-за «= [NSString» бит т.е.

// Autoreleased object 
tempString = [NSString stringWithFormat: @"Planet_%03d", planetLoop+1]; 
// String literal 
tempString = @"Planet_"; 

большое спасибо, очень ценится -gary-

ответ

5

tempString не на самом деле строковый литерал. @"Planet_%03d"is строка литерала. tempString - это автореализованный объект, что означает, что он будет выпущен, когда NSAutoreleasePool будет слит. В принципе, память уже управляется, и вам не нужно ничего делать.

Правило: Если вы new, alloc, copy или retain объект, то вы должны release его. В противном случае память уже управляется, возможно, авторекламой.

Также вы забыли освободить pool. Кроме этого, все выглядит отлично.

+1

Он выпустил пул: [пул дренажа] –

+0

Спасибо, ребята, я вижу, что происходит сейчас, небольшое редактирование выше, чтобы объяснить ... – fuzzygoat

+0

@ Крис, ты прав. Я не знал, что 'drain' делает' release'. –

1

Одной из возможных причин для «не в состоянии прочитать команду 0x80000022 неизвестной нагрузки» ошибки, кажется, что я повышен до Snow Leopard без обновления разработчиков инструментов одновременно. Похоже, что ошибка может быть вызвана попыткой использовать версию 10.5 для XCode для компиляции в среде 10.6. Я рассмотрю это завтра.

Xcode 3.2 теперь доступен в выпуске Snow Leopard (Mac OS X 10.6). После установки Snow Leopard обновите до Xcode 3.2, установив его отдельно от образа диска Xcode Tools. Вы можете установить его поверх предыдущих версий Xcode или отложить их перед установкой.

PS: Когда я получил "не в состоянии прочитать команду 0x80000022 неизвестного груза" ошибку я бегала OSX 10.6.1 с Xcode 3.1.2

веселит -gary-

+0

Если ваши инструменты не синхронизированы с версией операционной системы, которую вы используете, исправить это первое. Это известная нестабильная конфигурация. – NSResponder

Смежные вопросы