Инициализация Cocoa Touch NSArray не работает должным образом - PullRequest
2 голосов
/ 14 августа 2011

У меня есть несколько NSAR-массивов ivar, которые я инициализирую в своем методе -viewDidLoad. Один содержит строки, один содержит IBOutlets. Однако, когда я инициализирую, все объекты в массиве находятся вне области видимости, и адрес памяти равен 0x0 (согласно отладчику Xcode). Однако, когда у меня есть локальный NSArray с теми же объектами, он работает нормально. Инициализация ивара 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? ОБНОВЛЕНИЕ: я использую ARC. После того, как я выключил ARC и выполнил чистую сборку, у меня больше не было этой проблемы. Это ошибка в ARC?

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

Ответы [ 3 ]

2 голосов
/ 14 августа 2011

Что вы используете ARC, важно помнить, задавая такой вопрос.

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

0 голосов
/ 14 августа 2011

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

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

на

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

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

0 голосов
/ 14 августа 2011

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

...