2009-07-14 2 views
2

싱글 톤 구조의 구조 내에서 NSString의 값을 char *에 할당하는 데 문제가 있습니다. 다음은 내 문제를 단순화 한 것입니다. 내 코드는 구조에서 더 많은 필드를 사용하고 NSString을 전달합니다. 에 struct1.string1의 값을 설정이 방법Objective-C의 구조 내에 NSString의 값을 char 배열로 저장하는 방법은 무엇입니까?

struct sampleStruct { 
    char *string1; 
    //other fields 
} struct1; 

:

내가 싱글 구조와 클래스 "SingletonClass"(내가 애플 문서 내 숙제를하고 올바르게 구현 한)을 말해봐

- (void)useCharArray { 
    //I would obviously be doing something more complex in reality 
    printf("This is the char array: %s", struct1.string1); 
    //doesn't print the value I assigned to it, but garbage 
} 
,536 : struct1.string1 사용

- (void)initStructWithString:(NSString *)inputString { 
    //warning: assignment discards qualifiers from pointer target type 
    struct1.string1 = [inputString cStringUsingEncoding:NSUTF8StringEncoding]; 
} 

이있어서 통과 하였다는 NSString

한 클래스에서 initStructWithString:(NSString *)inputString으로 전화를 걸어 다른 클래스에서 useCharArray에 전화하면 struct1.string1은 많은 양의 쓰레기입니다. 디버깅하는 동안 각 클래스가이 SingletonClass의 동일한 인스턴스를 가져 오는 것을 확인했습니다.

나는 여전히 Objective-C와 C를 배우면서 메모리 관리에 문제가 있다는 것을 알고 있습니다. 나는 [NSString cStringUsingEncoding]const char *이 아니라 char *으로 할당되어야한다는 것을 알고 있습니다. 그러나 구조의 필드가 char *이기 때문에 그것에 대해 어떻게 해야할지 모르겠습니다. 나는 initSructWithString 내에서 [NSString cStringUsingEncoding]의 결과를 새롭게 할당하고 그 다음에 strlcpystruct1.string1으로 복사하는 것과 같은 다른 접근법을 시도했다. 그 접근 방식은 같은 결과를 가져왔다.

구조체 내의 char *에서 NSString의 값을 저장하고, I는 SingletonClass 다른 클래스에서 사용되는이 구조체 내의 필드들의 값을 유지하는 것을 어떻게 보장 할 수에 대한 정확한 기술은 무엇인가?

답변

4

올바른 방법 이름은 cStringUsingEncoding:입니다. 이 문자열은 대략 inputString과 거의 동시에 사라 지므로 결과 문자열을 복사해야합니다.

대신에 UTF8String을 사용하는 것이 좋습니다 (동일한 기능을 수행하는 편리한 방법).

+0

고마워요.그래서 복사 할 때, strlcpy와 같은 것이 사라질 문자열에 대한 포인터를 복사 할 것이므로 memcpy를 사용하고 있는가? –

+0

memcpy를 사용하는 것은 항상 좋은 생각입니다. 복사하기 전에 대상 버퍼를 할당해야합니다. 문자열을 복사하기 위해 실제로 malloced 메모리를 가지고 있습니다. –

1

아직 그래서 (위의 대답 흐름이 완만 후) 여기에 작성 언급 할 수는 ... 그냥 (내가 나중에 몇 년의 실현)이 건너 와서 예를 들어 어느 정도 다른 사람을 도울 수있는 생각 :

iOS 게임 센터에서 플레이어의 이름을 얻으려는 경우이를 사용하여 펑키 캐릭터 등의 문제가 발생하지만 내 글꼴은 어쨌든 지원하지 않습니다. ppName 분명 나는이 코드를 가지고있는 방법에 전달되는 문자에 대한 포인터에 대한 포인터입니다.

*ppName = (char *)malloc(strlen([pPlayer.alias UTF8String])); 
strcpy(*ppName, [pPlayer.alias UTF8String]); 
0

당신이 (구조체에있는 NSString를 저장해야하고, 그 구조체에서 다시있는 NSString을받을 경우 예를 들어 게임 센터 멀티 플레이어 게임에서 다른 플레이어에게 문자열을 보내야하는 경우 다음과 같이 할 수 있습니다.

typedef struct { 
    char stringToSend[20]; 
    int stringToSendLength; 
} myStruct; 

// create a Struct and an NSString 
myStruct aStruct; 
NSString *stringToConvert = @"stringToConvert"; 

// convert NSString into char array 
for (int i = 0; i < stringToConvert.length; i++) { 
    aStruct.stringToSend[i] = [stringToConvert characterAtIndex:i]; 
} 

aStruct.stringToSendLength = stringToConvert.length; // send string length 

// store struct into NSData object 
NSData *data = [NSData dataWithBytes:&aStruct length:sizeof(myStruct)]; 

// retrieve data 
myStruct *anotherStruct = (myStruct *)[data bytes]; 

// convert char array into NSString and only keep part required (without some weird random characters) 
NSString *receivedString = [[NSString alloc] initWithBytes:anotherStruct->stringToSend length:anotherStruct->stringToSendLength encoding:NSASCIIStringEncoding]; 
관련 문제