39

我想char *UITextField

我尝试了什么:

char *data;
char *name=data+6;
txtName.text=[[NSString alloc] initWithCString:name encoding:NSUTF8StringEncoding];

但我没有得到正确的价值。

4

3 回答 3

75

要从 a 创建一个NSStringconst char *只需使用以下方法:

返回一个autoreleased 对象:

/**
 * Should be wrapped in `@autoreleasepool {...}`,
 * somewhere not far in call-stack
 * (as closer it's, the lower our memory usage).
 */
NSString *stringFromChar(const char *input) {
    return [NSString stringWithUTF8String: input];
}

每当我们return一个对象(可能是Swift)时,我们需要注册到最近的@autoreleasepool块中(通过调用autorelease方法来防止内存泄漏,根据所有权规则),但是ARC会自动为我们注册。

但即使ARC禁用,我们也不会被迫autorelease手动调用,例如:

return [[NSString stringWithUTF8String: name] autorelease];

通常,便利工厂方法(如stringWithUTF8String:)已经调用该autorelease方法(或者如果ARC禁用则应该调用该方法),因为该类根本不打算拥有该实例。

创建一个retained 对象:

NSString *result = [[NSString alloc] initWithUTF8String: name];

// ... Do something with resulted object.

// NOTE: calling below is not required
// (If ARC enabled, and should cause compile error).
[result release];

2021 年关于差异的更新;启用后,这ARC两种方法是等效的(即ARC会自动调用autorelease方法;​​总是注册到最近的@autoreleasepool)。

参考

如果你没有得到正确的值,那么数据有问题。添加一些NSLog调用以查看字符串包含的内容。

于 2012-05-29T10:31:33.303 回答
9

你能指望什么?您有一个未初始化的 char*。然后将 6 添加到指针,这已经是未定义的行为。然后你尝试将一个指向任何旧垃圾的指针(你不知道它指向哪里)指向一个 NSString*。没有什么好事可以由此而来。

使用 ASCII 或 UTF-8 编码定义一个指向实际的、真实的 C 字符串的 char*。然后像这样创建一个 NSString:

char* cstring = "Try harder";
NSString* objcstring = @(cstring);
于 2016-09-02T08:29:47.520 回答
6

您可以使用[NSString stringWithUTF8String: data].

于 2012-05-29T10:32:32.270 回答