IPHONE APP中的全局变量

时间:2009-10-16 10:34:02

标签: objective-c iphone

如何在Objective C和其他文件中使用extern声明和使用全局变量。

我想在1.h文件和1.m中定义和分配全局变量,并希望在2.m文件中使用它

我正在定义

1.h

extern const NSString *str;

1.m

NSString *str=@"HELLO";
2.m中的

我正在导入1.h

想要访问str但是给我2.o错误。

4 个答案:

答案 0 :(得分:3)

如果这些是应用程序设置,则应考虑使用NSUserDefaults。如果它是常量,则应在前缀头文件中定义它们。

答案 1 :(得分:2)

全局变量是设计糟糕的好兆头。我猜测,根据您之前的评论,您要做的是从一个视图控制器发送字符串到另一个视图控制器。有两种正确的方法可以做到这一点:

让发送类还定义用于接收结果字符串的协议。例如,UIImagePickerController和用户输入的所有其他Cocoa控制器就是这样做的。一个例子:

@protocol MyTextInputDelegate;

@interface MyTextInput : UIViewController {
  id<MyTextInputDelegate> textInputDelegate;
}
@property(nonatomic,assign) id<MyTextInputDelegate> textInputDelegate;
// More interfaces here...
@end

@protocol MyTextInputDelegate
-(void)textInput:(MyTextInput*)textInput didInputText:(NSString*)text;
@end

然后让需要结果的类符合MyTextInputDelegate协议,并将其设置为委托。这样就可以避免全局变量,并且不存在谁拥有文本对象的问题。

另一种方法是将结果作为NSNotification发送。这稍微难以设置,只有在发送方和接收方之间需要松散连接时才能使用。

答案 2 :(得分:0)

你说:

  

定义1.h extern const NSString   *海峡; 1.m NSString * str = @“HELLO”

这不是一种传递全局字符串的方法,它是一种使用常量NSString的方式,而不是每次都必须输入静态字符串。

无论如何,写作

extern const NSString *str;

const是没有意义的,因为NSString是不可变的。您应该将这些声明为

extern NSString * const str;

在这种情况下,实际指针是一个常量,这可能是所需的行为。

Anyay;我同意PeyloW,在全球范围内传递价值观应该重新考虑。我并不是说不应该这样做,只是你不应该把它作为传递状态的第一种方法。

答案 3 :(得分:0)

如果您想要存储和修改多个类的中心值,请考虑将它们放入单个对象或应用程序委托(实际上也是单个)。然后他们是“全球性的”,但你更清楚知道什么是访问什么。