NSMutableArray автоматически вводит тип в NSArray - PullRequest
2 голосов
/ 15 марта 2012

Я создал объект NSMutableArray с помощью

NSMutableArray *array = [[NSMutableArray alloc]init];

и использовал метод componentSeperatedByString: как

array = [myString componentsSeperatedByString:@"++"];

, но когда я выполнял операции над массивом, как,

[array removeAllObjects];

У меня возникло исключение, например, «RemoveAllObjects нераспознанный селектор отправить в экземпляр».

Я решил эту проблему, изменив код, например,

NSArray *components = [myString componentsSeperatedByString:@"++"];



array = [NSMutableArray arrayWithArray:components];

, и после этого я мог выполнить такую ​​операцию, как

[array removeAllObjects];

Я сомневаюсь, почему NSMutableArray автоматически преобразован в NSArray?Как я могу избежать автоматического преобразования типов, как это, чтобы предотвратить исключения?Заранее спасибо ....

Ответы [ 6 ]

6 голосов
/ 15 марта 2012

В вашем понимании того, как работает Objective-C, есть ошибка.Эта строка:

NSMutableArray *array = [[NSMutableArray alloc]init];

выделяет и инициализирует массив, а указатель array указывает на этот объект.Теперь эта строка:

array = [myString componentsSeperatedByString:@"++"];

делает указатель array для указания на новый массив, возвращаемый методом componentsSeparatedByString.При этом вы теряете ссылку на свой выделенный и инициируемый изменяемый массив и создаете утечку памяти, если не используете ARC.

4 голосов
/ 15 марта 2012

Это происходит потому, что [myString componentsSeperatedByString:@"++"] возвращает NSArray. Вы можете попробовать что-то вроде этого:

array = [[myString componentsSeperatedByString:@"++"] mutableCopy];

или

array = [NSMutableArray arrayWithArray:[myString componentsSeperatedByString:@"++"]];
1 голос
/ 15 марта 2012

На линии

array = [myString componentsSeperatedByString:@"++"];

вы заменяете NSMutableArray, который вы выделили, новым NSArray (и пропускаете ваш NSMutableArray. Попробуйте использовать это:

NSMutableArray *array = [NSMutableArray arrayWithArray:[myString componentsSeperatedByString:@"++"]];
1 голос
/ 15 марта 2012

Это потому, что – componentsSeparatedByString: возвращает NSArray: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html#//apple_ref/occ/instm/NSString/componentsSeparatedByString:

Сделайте что-то вроде:

array = [NSMutableArray arrayWithArray:[myString componentsSeperatedByString:@"++"]];
0 голосов
/ 15 марта 2012

Экземпляр NSMutableArray не будет преобразован автоматически.

Метод componentSeperatedByString возвращает NSArray-Object.Вы должны получить предупреждение компилятора при назначении возвращаемого значения NSMutableArray-Pointer.

0 голосов
/ 15 марта 2012

Не конвертируется, указатель массива может быть UIButton *, если вы напишите что-то вроде

array = [self likeThatButton];

, где likeThatButton - ваш метод, возвращающий UIButton *.Как всегда в цели c, массив NSMutableArray * означает, что только Xcode попытается проанализировать ваш код и предложить удобные предупреждения и завершение кода.

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