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