2

我在单例类的结构中将 an 的值分配NSString给 a时遇到问题。char *以下是我的问题的简化。我的代码在结构中使用了更多的字段并传递了更多NSString的 s。

假设我有一个带有结构的单例类“SingletonClass”(我已经完成了 Apple 文档的作业并正确实现了它):

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

使用此方法将值设置struct1.string1为传递的 NSString:

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

这个方法使用struct1.string1

- (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
}

当我initStructWithString:(NSString *)inputString从一个班级打电话并尝试useCharArray从另一个班级打电话时struct1.string1是一堆垃圾。在调试过程中,我已经确认每个类都获得了相同的 this 实例SingletonClass

我还在学习 Objective-C 和 C,所以我知道这可能是我的内存管理的问题。我知道我[NSString cStringUsingEncoding]应该分配给 aconst char *而不是 a char *,但我不知道该怎么做,因为结构中的字段是 a char *。我尝试了其他方法,initSructWithString例如分配一个新const char *的结果,[NSString cStringUsingEncoding]然后用strlcpyto复制它struct1.string1。这种方法具有相同的结果。

将 a的值存储在结构中的正确技术是什么?NSString如何char *确保该结构中的字段在SingletonClass不同类使用时保持其值?

4

3 回答 3

4

值得注意的一件事是正确的方法名称是cStringUsingEncoding:; 并且该字符串大致同时消失inputString,因此必须复制生成的字符串。

也可能值得探索使用UTF8String替代(一种同样的便利方法)。

于 2009-07-14T16:22:48.367 回答
1

还不能评论,所以在这里写(在上面的答案之后)......刚刚遇到这个(我意识到这是几年后)并认为一个例子可能会在一定程度上帮助其他人:

我正在使用它从 iOS 上的游戏中心获取玩家的姓名,我会遇到时髦字符等问题,但我的字体无论如何都不支持它们。ppName 显然是一个指向 char 的指针,传递给我有这个代码的方法。

*ppName = (char *)malloc(strlen([pPlayer.alias UTF8String]));
strcpy(*ppName, [pPlayer.alias UTF8String]);
于 2011-04-03T07:09:25.100 回答
0

如果您需要将 NSString 存储在一个结构中,然后从该结构中获取一个 NSString(例如,如果您需要在 Game Center 多人游戏中向另一个玩家发送一个字符串),您可以这样做:

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];
于 2013-10-19T14:51:00.837 回答