2010-08-16 3 views
2

привет я работаю с NSArrays с помощью инструмента фундамента и я написал следующий кодразница между NSArray и NSMutable массива

-(void)simplearrays 
{ 
NSMutableArray *arr = [NSMutableArray arrayWithCapacity:3]; 

for(int i =0;i<3;i++) 
{ 
    scanf("%d",&arr[i]); 
} 
for(int j =0; j<3;j++) 
{ 
    printf("\n%d",arr[j]); 
} 
} 

Мой запрос является то, что приведенный выше код при выполнении показывает данный выход, но я получаю сообщение об ошибке как только приложение завершит выполнение, в котором говорится, что «не может выделить регион», можете ли вы помочь.

Также я хотел узнать разницу между NSArray и NSMutable Array в блоке icode. Я прочитал, что nsarray может динамически изменять размер, поэтому, если NSArray может динамически изменять размер, то зачем использовать массив NSMutable, или лучше, когда использовать NSArray и когда использовать NSMutable Array ???

+0

Вы не можете использовать NSArray как это ... – kennytm

+0

Тогда как я могу принимать значения во время выполнения в NSarray от пользователя ???? – Radix

ответ

6

Какао массивов а не C. Это контейнерные объекты с некоторым сходством с векторами Java и списками массивов.

Вы не можете добавлять объекты или извлекать их с использованием синтаксиса подстроки C, вам необходимо отправить сообщения объекту.

-(void)simplearrays 
{ 
    NSMutableArray *arr = [NSMutableArray array]; 
    // arrayWithCapacity: just gives a hint as to how big the array might become. It always starts out as 
    // size 0. 

    for(int i =0;i<3;i++) 
    { 
     int input; 
     scanf("%d",&input); 
     [array addObject: [NSNumber numberWithInt: input]]; 
     // You can't add primitive C types to an NSMutableArray. You need to box them 
     // with an Objective-C object 
    } 
    for(int j =0; j<3;j++) 
    { 
     printf("\n%d", [[arr objectAtIndex: j] intValue]); 
     // Similarly you need to unbox C types when you retrieve them 
    } 
    // An alternative to the above loop is to use fast enumeration. This will be 
    // faster because you effectively 'batch up' the accesses to the elements 
    for (NSNumber* aNumber in arr) 
    { 
     printf("\n%d", [aNumber intValue]); 
    } 
} 
+0

Привет, Джереми, спасибо за сообщение ответа, который мне очень помог, но я просто хочу спросить вас, каким образом мы можем использовать NSArray для принятия значений от пользователя во время выполнения. – Radix

+0

Нет. Вам нужно использовать NSMutableArray способом, подобным пример выше - вы не можете добавлять новые элементы в NSArray. Однако существуют другие способы получить целое число от ввода, например. используйте NSScanner. – JeremyP

1

Вы используете NSMutableArray, если хотите добавить/удалить объекты из массива.

Если вы создаете массив только с объектами, и вы не планируете изменять содержимое, используйте NSArray.

Вы можете конвертировать из одного в другое.

1

NSArray и NSMutableArray не просто синонимы для массивов C, они представляют собой объекты-контейнеры со своими интерфейсами. Если вы хотите вставить объекты в один, это должно быть NSMutableArray, и вам необходимо вызвать методы мутаторов, такие как addObject:. Вы не можете просто использовать оператор []. Аналогично для чтения объектов - вы должны пройти такие методы, как objectAtIndex:.

(Обратите внимание, что ваш код рода- синтаксический правильный, поэтому компилятор позволяет сделать это на всех -.. Вы используете [] разыменования указателя Но это семантический очень неправильно Это будет не делайте то, что хотите, и, скорее всего, испортите память потенциально катастрофическими способами.)

6

NSArray и NSMutableArray - это классы фундамента и типы данных, которые представляют поведение массива. Вы можете хранить любой объект не-примитивных типов в обоих из них. Оба сохраняют объекты, которые они хранят, и освобождают объекты, когда они удаляются, или сам объект массива освобождается. Когда использовать какой? Ну, если вы не склонны добавлять/удалять объекты в/из массива, вы должны использовать NSArray, позвонив по одному из статических методов и указания объектов для хранения, а именно:

NSArray *colors = [NSArray arrayWithObjects:@"Red", @"Green", @"Blue", nil]; 

Если вы, вероятно, добавьте/удалите объекты в/из массива после его создания, вы должны использовать NSMutableArray. Вы можете создать массив с или без указания исходных объектов для хранения, а затем добавлять/удалять объекты в/из массива в любое время, то есть:

NSMutableArray *colors = [[NSMutableArray alloc] init]; 
[colors addObject:@"Red"]; 
[colors addObject:@"Green"]; 
[colors addObject:@"Blue"]; 
[colors removeObjectAtIndex:0]; 
NSLog(@"Color: %@", [colors objectAtIndex:1]); 
[colors release]; 

Проверить это больше: Collections Programming Topics

+0

Не позволяет NSArray добавлять и удалять элементы? –

+1

Это не так. Вы можете использовать NSMutableArray для добавления и удаления элементов. –

0

Основное отличие состоит в том, что вы не можете добавить объект в NSArray. Итак, если вы хотите иметь массив, к которому хотите добавить объект, вы должны использовать массив NSMutable.

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