main()外部的变量值不正确

时间:2010-04-05 21:58:44

标签: objective-c cocoa

我有这个代码

#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值?我该怎么办,在输出中有正确的“测试字符串”?

4 个答案:

答案 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"];

顺便说一下,您不需要在此使用allocinitWithString:@"test string"已经是NSString对象。当你做alloc某事时,不要忘记释放它(假设你没有打开GC)。

答案 2 :(得分:1)

您有两个名为testint的不同变量。 main()中的那个正在影响全球的那个。

答案 3 :(得分:1)

  

我应该如何使用“alloc init”声明全局对象?

字符串是一种特殊情况。你可以这样做:

NSString* foo = @"bar";