Разница между NSArray и NSMutable Array - PullRequest
2 голосов
/ 16 августа 2010

Привет, я работаю с NSArrays, используя фундаментальный инструмент, и я написал следующий код

    -(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 ???

Ответы [ 5 ]

6 голосов
/ 16 августа 2010

Массивы какао не являются массивами 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]);
    }
}
6 голосов
/ 16 августа 2010

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];

Проверьте это для получения дополнительной информации: Темы программирования коллекций

1 голос
/ 16 августа 2010

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

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

1 голос
/ 16 августа 2010

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

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

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

0 голосов
/ 13 октября 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...