2010-07-11 8 views
0

나는아이폰있는 NSString 배열

NSString *dayinfield[43]; 

을 선언

-(void)DrawDemo { 
dayinfield[2] = @"hallo"; 
dayinfield[3] = @"test"; 

// also i can read it 
NSLog (@"show: %@",dayinfield[2]); 
//works fine 
} 

에 그것을 채우기하지만 난 다른 함수의 내용을 읽고 (같은 클래스)를 좋아하는 경우

-(void)ReadData 
{ 
NSLog (@"show: %@",dayinfield[2]); 
// I get random infos or “EXC_BAD_ACCESS 
} 

은 어떻게 내 함수의 각 내용에 도달 할 수 있도록 NSString Array를 올바르게 초기화합니까 ?? 여기에 게시 것보다 당신이 -ReadData 전에 -DrawDemo 전화 또는 사용하지 않은 경우 다른 인덱스, - 어레이 (또는 그것의 부분이 액세스)를 초기화하지 않을 경우

감사 크리스

+2

'-DrawDemo'가'-ReadData' 전에 호출 되었습니까? –

+0

그런데'dayinfield'가 선언 한 곳은 - 정말로 ivar입니까? –

답변

1

배열 요소에 리터럴 만 할당하는 경우 문제가되지 않습니다. 그러나 다른 문자열을 사용하는 경우 C 배열을 사용할 때 인스턴스를 수동으로 유지해야합니다.

Bye : Objective-C 방법은 소문자로 시작합니다.

+0

thx는 소문자에 대해 기억하고 있습니다. 심지어 지금도 :) :)하지만 내 문자열 배열 prob 여전히 존재합니다. 어떤 다른 데모조차 환영합니다.> 나는 수업에서 어디서든지 채울 수있는 배열을 필요로합니다. –

0

이 일어날 것 배열은 단순히 쓰레기 값을 포함합니다.

이니셜 라이저 메서드에서 배열 내용을 nil 또는 @""으로 초기화하고 문제가 지속되는지 확인하십시오.

또는 적절한 코코아 용기 사용을 고려하십시오.

+0

DrawDemo가 ReadData 앞에 있는지 확인하십시오. DrawDemo에서 언급했듯이 데이터 완벽을 읽을 수 있습니다. 방금 할당 해제 한 다른 함수 밖에 있습니다.어떤 다른 데모조차 환영합니다.> 필자가 수업에서 어디서든지 채울 수있는 배열을 필요로합니다. –

+1

@christian : 빠르고, 더럽습니다. http://pastebin.com/jyYaVNxm –

+1

By the 사실, 당신이'-DrawDemo'에서 읽을 수는 있지만'-ReadData'에서는 읽을 수 없다는 것이 정확히'-DrawDemo'가 먼저 호출되지 않을 수도 있다는 것입니다. –

0

두 번째 호출 전에 메모리가 해제 될 가능성이 있습니다. dayinfield을 ivar로 선언했다고 가정하면 (항상 나쁜 액세스를 얻지 못한다는 사실) 문자열이 제대로 보존되지 않습니다.

dayinfield[2] = [[NSString alloc] initWithString:@"hallo"]; 
dayinfield[3] = [[NSString alloc] initWithString:@"test"]; 

하고 클래스 (Memory Management Guide 참조) 해제되고있어 후 당신이 그들을 해제해야합니다 :

은 다음과 같이 문자열을 초기화한다.

분명히 그것은 당신이하고 싶은 것에 달려 있지만 C 배열 대신 NSArray을 사용하면 더 쉬울 수도 있습니다.

+0

@Mo :'var = [hello "retain];'역시 완벽하게 유효합니다. –

+1

문자열 리터럴이 할당 해제되지 않습니다 ([here] (http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/Strings/Articles/CreatingStrings.html) 참조) : * "컴파일러 이러한 객체 상수는 모듈 단위로 고유하게 만들어지며 다른 객체와 마찬가지로 유지하고 해제 할 수 있지만 결코 할당이 해제되지 않습니다. "*. –

+0

+1 당신의 무작위 응답에, 나는이 코멘트에 신용을 줄 수 없기 때문에 +1! –

0

개체가있는 오래된 학교 C 배열을 사용하는 것은 순수한 매저키즘의 연습이지만 OP에있는 것은 작동해야합니다.

는이 코드 실행 :

@interface TestClass : NSObject { 
    NSString *a[1]; 
} 
- (void) drawDemo; 
- (void) readData; 
@end 

@implementation TestClass 

- (void) drawDemo{ 
    a[0][email protected]"A Zero"; 
    a[1][email protected]"A One"; 
}//------------------------------------- (void) drawDemo------------------------------------ 

- (void) readData{ 
    NSLog(@"a[0]=%@,a[1]=%@",a[0],a[1]); 
}//------------------------------------- (void) readData------------------------------------ 

@end 

TestClass *tc=[[TestClass alloc] init]; 
[tc drawDemo]; 
[tc readData]; 

을 ... 그리고이 출력을 가지고 :

a[0]=A Zero,a[1]=A One 

귀하의 문제가 코드에서 다른 곳입니다. C 배열을 객체와 함께 사용하는 강력한 이유는 없습니다. 당신은 아무것도 얻지 못하고 오류를 막기 위해 그들을 매 (hawk)처럼보아야합니다.