我想在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值总是会导致错误。
答案 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对象相同,也可能不同,但您不必关心。内存管理明智,您拥有它,因此您有责任确保最终在其上调用release
或autorelease
以避免泄漏内存。
@"etc etc"
[NSString stringWithString:@"etc etc"]
那些基本相同。两者都为您提供了一个内容为etc etc
的NSString对象。这可能与程序中具有相同内容的任何其他NSString对象相同,也可能不同,但您不必关心。内存管理明智,您不拥有它,因此您必须不调用对象上的release
或autorelease
,除非您首先通过调用retain
取得所有权。此外,由于您不拥有它,您可以在方法中使用它,将其作为参数传递给其他方法,甚至将其用作方法的返回值,但您不能将其存储在ivar或静态变量中无需通过致电retain
或制作副本(copy
)获取所有权。
另请注意,""
和@""
非常不同。第一个给出了一个const char *
,就像它在C中一样,而第二个给你一个NSString对象。如果您使用代码需要NSString对象的const char *
,您的程序将崩溃。
答案 2 :(得分:2)
发布实际代码,而不是伪代码,因为它可以更容易地用具体的术语回答您的问题。
鉴于您表明您对Objective-C不熟悉,我建议您从language guide开始,然后转到memory management guide。