Добавление строковых объектов в NSMutableArray?
-
07-07-2019 - |
Вопрос
У меня есть небольшой базовый тест (Objective-C), с которым я играю, и у меня есть несколько вопросов ...
#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 " является строковым литералом, и поэтому его не нужно выделять или освобождать?
Во-вторых, когда я запускаю это (до выполнения), я получаю следующее сообщение об ошибке " невозможно прочитать неизвестную команду загрузки 0x80000022 " если это проблема с моим кодом? от поиска в Google похоже, что это может быть ошибка в xCode 3.1.2, у кого-нибудь есть какие-нибудь идеи?
Наконец, если я что-то не так делаю, идея состоит в том, чтобы заполнить массив 10 строками " Planet_001 " до "Planet_010"
РЕДАКТИРОВАТЬ: Ах, я вижу, это из-за " = [NSString " бит то есть.
// Autoreleased object
tempString = [NSString stringWithFormat: @"Planet_%03d", planetLoop+1];
// String literal
tempString = @"Planet_";
большое спасибо, очень ценю -gary -
Решение
tempString
на самом деле не является строковым литералом. @ " Planet_% 03d "
является строковым литералом. tempString
- объект с автоматическим выпуском, то есть он будет освобожден при сливе NSAutoreleasePool. По сути, память уже управляется, и вам не нужно ничего делать.
Правило: Если вы new
, alloc
, скопируйте
или оставьте
объект, затем вам нужно освободить
его. В противном случае память уже управляется, возможно, с помощью автоматического выпуска.
Кроме того, вы забыли освободить пул
. Кроме того, это выглядит хорошо.
Другие советы
Одна из возможных причин, по которой " невозможно прочитать неизвестную команду загрузки 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
ура -Гэри -
Это " команда загрузки " ошибка связана с тем, что формат исполняемого файла был изменен с iPhone OS 3.0 на iPhone OS 3.1.
http://networkpx.blogspot.com/2009/09 /about-lcdyldinfoonly-command.html р>