我有这个代码
#import <Foundation/Foundation.h>
int testint;
NSString *teststring;
int Test()
{
NSLog(@"%d",testint);
NSLog(@"%@",teststring);
}
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
testint = 5;
NSString *teststring = [[NSString alloc] initWithString:@"test string"];
Test();
[pool drain];
return 0;
}
在输出中我有:
5 (空)
为什么Test函数看不到正确的teststring值?我该怎么办,在输出中有正确的“测试字符串”?
答案 0 :(得分:6)
您正在使用本地变量遮蔽全局变量。如果意图是使用全局testString,则不应使用“NSString *”重新声明它。
答案 1 :(得分:2)
在输出中我有:
5 (null)
为什么Test函数看不到正确的teststring值?
因为你从未在那里分配任何东西。在main
中,您声明了一个具有相同名称的局部变量,并使用指向您创建的NSString对象的指针初始化该变量。
我应该如何使用“alloc init”声明全局对象?
你没有。
声明创建变量(或有时是类型)。 NSString *teststring
行(两者都是)声明:一个全局变量,另一个是局部变量。
alloc
消息(以及大多数其他类消息)创建对象。
因此,这一行:
NSString *teststring = [[NSString alloc] initWithString:@"test string"];
声明了一个局部变量(teststring
)和创建了一个字符串对象,并初始化该变量以保存指向字符串对象的指针。
(注意“initWithString:
”初始化对象,而不是变量。从=
到分号的部分是变量的初始化器。)
您打算分配给全局变量,而不是声明局部变量。那么,这样做:省略类型说明符将声明转换为赋值语句:
teststring = [[NSString alloc] initWithString:@"test string"];
顺便说一下,您不需要在此使用alloc
和initWithString:
。 @"test string"
已经是NSString对象。当你做alloc
某事时,不要忘记释放它(假设你没有打开GC)。
答案 2 :(得分:1)
您有两个名为testint
的不同变量。 main()
中的那个正在影响全球的那个。
答案 3 :(得分:1)
我应该如何使用“alloc init”声明全局对象?
字符串是一种特殊情况。你可以这样做:
NSString* foo = @"bar";