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

时间:2011-03-20 17:12:13

标签: iphone objective-c xcode function 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;
}

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

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

static NSstring *xx;

或非静态:

NSString *xx;

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

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

[[NSString alloc] initWithString:@"etc etc" ];

或简单的作业:

var = @""

甚至:

var = [NSString stringWithString:@"etc etc"];

请你帮我一把吗?

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

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:8)

static NSstring *xx;

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

NSstring *xx;

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

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

[[NSString alloc] initWithString:@"etc etc"]

创建一个新的NSString对象,其内容为etc etc。这可能与程序中具有相同内容的任何其他NSString对象相同,也可能不同,但您不必关心。内存管理明智,您拥有它,因此您有责任确保最终在其上调用releaseautorelease以避免泄漏内存。

@"etc etc"
[NSString stringWithString:@"etc etc"]

那些基本相同。两者都为您提供了一个内容为etc etc的NSString对象。这可能与程序中具有相同内容的任何其他NSString对象相同,也可能不同,但您不必关心。内存管理明智,您不拥有它,因此您必须调用对象上的releaseautorelease,除非您首先通过调用retain取得所有权。此外,由于您不拥有它,您可以在方法中使用它,将其作为参数传递给其他方法,甚至将其用作方法的返回值,但您不能将其存储在ivar或静态变量中无需通过致电retain或制作副本(copy)获取所有权。

另请注意,""@""非常不同。第一个给出了一个const char *,就像它在C中一样,而第二个给你一个NSString对象。如果您使用代码需要NSString对象的const char *,您的程序崩溃。

答案 2 :(得分:2)

发布实际代码,而不是伪代码,因为它可以更容易地用具体的术语回答您的问题。

鉴于您表明您对Objective-C不熟悉,我建议您从language guide开始,然后转到memory management guide