Cocoa Инициализация Touch NSArray не работает должным образом

77
6

У меня есть несколько NSAR NSV, которые я инициализирую в моем методе -viewDidLoad. Один содержит строки, один содержит IBOutlets. Однако при инициализации все объекты в массиве выходят за пределы области видимости, а адрес памяти равен 0x0 (в соответствии с отладчиком Xcode). Однако, когда у меня есть локальный NSArray с теми же объектами, он отлично работает. Инициализация ivar NSString или NSDictionary работает отлично.


Код:


//.h file
#import <UIKit/UIKit.h>
@interface myViewController : UIViewController
{
NSArray *myArray;
}
@end

//.m file
#import "myViewController.h"
@implementation myViewController
- (void)viewDidLoad
{
[super viewDidLoad];
myArray = [[NSArray alloc] initWithObjects:@"aString", @"another string", nil];
NSLog(@"myArray equals: %@.", myArray);
}
@end


Когда я пытаюсь использовать массив, я получаю ошибку выполнения EXC_BAD_ACCESS. Является ли это ошибкой Xcode, или я что-то пропустил в NSArray? UPDATE: Я использую ARC. После того, как я выключу ARC и сделаю чистую сборку, я больше не получаю эту проблему. Это ошибка в ARC?


Я не знаю, в чем проблема, но я перешел на стабильную версию Xcode (4.0.2), и у меня не было никаких проблем вообще. Спасибо всем за помощь!

спросил(а) 2021-01-25T23:56:23+03:00 5 месяцев назад
1
Решение
77

То, что вы используете ARC, важно учитывать при задании такого вопроса.

Как вы пытаетесь использовать массив (показать код)? В некоторых версиях ARC существует известная ошибка (которая не может обсуждаться на стороне iOS, но такая же ошибка содержится в выпуске Lion ARC), где быстрое перечисление коллекции в ARC может вызвать сбой.

ответил(а) 2021-01-25T23:56:23+03:00 5 месяцев назад
45

Похоже, что фреймворк еще не создавал экземпляры IBOutlet. Можете ли вы удержать и заполнить массивы в методе viewWillAppear? Это будет вызвано до того, как пользователь увидит что-нибудь. В противном случае вытащите их из IB, просто управляйте ими вручную и распределите их в любой момент, который вы хотите.

ответил(а) 2021-01-25T23:56:23+03:00 5 месяцев назад
45

Ваш пример кода, как представляется, выделяет новую (и локальную) версию myArray, а не установку iVar, который вы объявляете в своем файле заголовка. Попробуйте изменить:


NSArray *myArray = [[NSArray alloc] initWithObjects:@"aString", @"another string", nil];

к

myArray = [[NSArray alloc] initWithObjects:@"aString", @"another string", nil];

С отключенным ARC я бы предположил, что любая попытка, которую вы делаете для доступа к myArray, ничего не сделает, потому что она будет установлена ​​на nil и игнорирует все сообщения. Я не уверен, почему этот код будет работать по-разному с включенным ARC.

ответил(а) 2021-01-25T23:56:23+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема