如何使用临时变量在Objective-C/Xcode中定义返回的NSString函数?

Par*_*oft 3 iphone xcode function objective-c nsstring

我想在Objective-C中定义以下函数.我提供了伪代码来帮助说明我正在尝试做什么.

伪代码:

function Foo(param) {
  string temp; 

if(param == 1) then
  temp = "x";
else if(param == 2) then
  temp = "y";
else if(param == 3) then 
  temp = "z";
else
  temp = "default";
end if    

  return temp;
}
Run Code Online (Sandbox Code Playgroud)

出于某种原因,如果我这样做...我分配给它的变量导致"BAD Access"错误.

我不知道之间有什么区别:

static NSstring *xx;
Run Code Online (Sandbox Code Playgroud)

或非静态的:

NSString *xx;
Run Code Online (Sandbox Code Playgroud)

声明是,以及如何或为什么我想要使用一个而不是另一个.

我也不完全理解NSString的初始化器,以及它们之间的区别.例如:

[[NSString alloc] initWithString:@"etc etc" ];
Run Code Online (Sandbox Code Playgroud)

或简单的任务:

var = @""
Run Code Online (Sandbox Code Playgroud)

甚至:

var = [NSString stringWithString:@"etc etc"];
Run Code Online (Sandbox Code Playgroud)

你可以帮我一把吗?

到目前为止,使用从上面列出的函数返回的NSString值总是会导致错误.

Mic*_* K. 8

你可以这样做:

- (NSString *)functionName:(int)param {
    NSString *result = nil;

    switch (param) {
        case 1:
            result = [NSString stringWithString:@"x"];
            break;
        case 2:
            result = [NSString stringWithString:@"y"];
            break;
        case 3:
            result = [NSString stringWithString:@"z"];
            break;
        default:
            result = [NSString stringWithString:@"defaultv"];
            break;
    }

    return result;
}
Run Code Online (Sandbox Code Playgroud)


Ano*_*mie 8

static NSstring *xx;
Run Code Online (Sandbox Code Playgroud)

这声明了一个静态分配的变量,就像在C中一样.

NSstring *xx;
Run Code Online (Sandbox Code Playgroud)

在声明普通本地堆栈变量的方法内部,就像在C中一样.

正如您应该知道的那样,两者之间的区别在于第一个将在函数的调用之间保持其值(如果从多个线程调用该函数,则会导致问题).

[[NSString alloc] initWithString:@"etc etc"]
Run Code Online (Sandbox Code Playgroud)

这将创建一个带有内容的新NSString对象etc etc.这可能与程序中具有相同内容的任何其他NSString对象相同,也可能不同,但您不必关心.内存管理明智,你拥有它,所以你有责任确保你最终打电话releaseautorelease在它上面,以避免泄漏内存.

@"etc etc"
[NSString stringWithString:@"etc etc"]
Run Code Online (Sandbox Code Playgroud)

那些基本相同.两者都为您提供了包含内容的NSString对象etc etc.这可能与程序中具有相同内容的任何其他NSString对象相同,也可能不同,但您不必关心.内存管理明智,你不拥有它,所以除非你先通过调用取得所有权,否则你不能调用release或者autorelease在对象上retain.此外,由于您不拥有它,您可以在方法中使用它,将其作为参数传递给其他方法,甚至将其用作方法的返回值,但您不能将其存储在ivar或静态变量中没有通过打电话retain或复制(带copy)获得所有权.

另外,请注意""并且@""非常不同.第一个给出了const char *与C完全相同的内容,而第二个给出了NSString对象.如果您使用代码期望NSString对象的位置,您的程序崩溃const char *.