Getting NSString from char * (Converting C's char-pointer)

ios, iphone, objective-c

Solution

To create an `NSString` from a `const char *`, simply use these methods:

Returns an `autorelease`d object:

/**
 * 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];
}

Whenever we `return` an object (maybe to `Swift`), we need to register into nearest `@autoreleasepool` block (by calling `autorelease` method to prevent memory-leak, according to ownership-rules), but `ARC` does that automatically for us.

But even with `ARC` disabled, we are NOT forced to call `autorelease` manually, like:

return [[NSString stringWithUTF8String: name] autorelease];

Generally, convenience factory methods (like `stringWithUTF8String:`), already call the `autorelease` method (or should if `ARC` disabled), because the class simply does not intend to own the instance.

Creates a `retain`ed object:

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];

Update 2021 about difference; With `ARC` enabled, these two methods are equivalent (i.e. `ARC` will auto-call `autorelease` method; always registering to nearest `@autoreleasepool`).

Reference.

If you are not getting the correct value, then something is wrong with the data. Add a few `NSLog` calls to see what the strings contain.

Problem

I want to show the `char *` in the `UITextField` What I tried: ``` char *data; char *name=data+6; txtName.text=[[NSString alloc] initWithCString:name encoding:NSUTF8StringEncoding]; ``` but I am not getting the correct value.

Original source

Related problems