2

내 -viewDidLoad 메서드에서 초기화하는 여러 ivar NSArrays가 있습니다. 하나는 문자열을 포함하고, 하나는 IBOutlets를 포함합니다. 그러나 초기화 할 때 배열의 모든 개체가 범위를 벗어 났고 메모리 주소는 0x0입니다 (Xcode 디버거에 따라 다름). 그러나, 같은 개체가있는 로컬 NSArray있을 때 잘 작동합니다. ivar NSString 또는 NSDictionary 초기화 모두 잘 작동합니다.코코아 터치 NSArray 초기화가 제대로 작동하지 않습니다.

코드 :

//.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)의 안정 버전으로 전환했는데 전혀 문제가 없었습니다. 도움을 주신 모든 분들께 감사드립니다!

답변

2

ARC를 사용한다는 것은 이러한 질문을 할 때주의해야합니다.

어떻게 배열을 사용하려고합니까 (코드 표시)? 특정 버전의 ARC에는 알려진 버그가 있습니다 (iOS 측에서는 논의 할 수 없지만 ARC의 Lion 릴리스에는 동일한 버그가 있습니다). ARC에서 컬렉션을 빠르게 열거하면 충돌이 발생할 수 있습니다.

+0

현재 NSLog를 사용하려고합니다. 코드는'NSLog (@ "% @", myArray);' – futurevilla216

+0

최소한의 예제를 게시 할 수 있습니까? – bbum

+0

좋아요, 원래 게시물을 업데이트하겠습니다. – futurevilla216

0

프레임 워크와 같은 사운드가 아직 IBOutlet 인스턴스를 인스턴스화하지 않았습니다. viewWillAppear 메서드에서 배열을 유지하고 채울 수 있습니까? 사용자가 무엇인가를보기 전에 호출됩니다. 그렇지 않으면 IB에서 꺼내어 수동으로 관리하고 원하는 모든 지점에 할당하십시오.

+0

IBOutlet의 문제라고 생각하지 않습니다. NSString을 배열로 가지고있을 때 같은 문제가 발생하기 때문입니다. – futurevilla216

0

샘플 코드에서 헤더 파일에 선언 한 iVar를 설정하는 대신 myArray의 새로운 (로컬) 버전을 할당하는 것으로 보입니다. 변경 시도 :

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

ARC을 끈

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

에, 나는 당신이 만드는 어떤 시도에서 myArray 그것이 전무로 설정 될 수 있기 때문에 아무것도하지 않고 모든 메시지를 무시합니다 액세스 할 수 있다고 가정한다. 왜이 코드가 ARC를 사용하는 것과 다르게 작동하는지 확신 할 수 없습니다.

+0

네, 그게 내가 한 일입니다. 나는 오타를 만들었습니다. 죄송합니다! ARC가 켜져 있으면 작동하지 않습니다. ARC를 끄면 제대로 작동합니다. – futurevilla216

관련 문제