全球对象iphone

时间:2010-06-28 21:34:34

标签: iphone object global-variables

创建全局对象的最简单方法是什么。我试过在方法之外声明对象没有运气。

@implementation UV_TouchpadViewController;
NSMutableString *string = [NSMutableString stringWithFormat:@"text"];

6 个答案:

答案 0 :(得分:3)

非常接近 - 你不能使用非const表达式初始化非局部变量,并且方法调用本质上是非const的,即使它看起来应该是。基本上,将其改为

NSMutableString *string;

但是如果它只在实现文件中使用(例如,其他类只能通过UV_TouchpadViewController获取,不能直接获取/设置它(这也是推荐的模式)),然后将其限定为静态,像这样

static NSMutableString *string;

另一方面,如果您希望能够直接从外部UV_TouchpadViewController访问它,请不要使用静态,但添加

extern NSMutableString *string;

到你的标题文件(类@interface之外),包含标题的任何人都可以访问它。 (请注意,您可以将NSMutableString *string;放在头文件中,但这很快就会变得不清楚了。)

另外,如果你试图为单例类做这个,(我想不出有一个全局可变字符串的好理由 - 你知道它们不是线程安全吗?)我建议阅读Apple的首先是关于单身人士的文档,他们建议你使用ivars,而不是全局变量,甚至是单身人士。但是,UV_TouchpadViewController甚至不应该 一个单例(如果它以任何方式作为视图控制器),它应该只有一个实例,如果你想要的话。

另一方面,如果你只想让所有的UV_TouchpadViewControllers都能访问这一个变量,请注意几乎所有语言都认为这是一种糟糕的设计模式(全局变量很糟糕),而你应该坚持使用它,比如说,你的应用程序委托(保证有一个全局可访问的实例),它可以是一个ivar +访问器,通常被认为是一个设置和(有一点额外的代码)持久化。

编辑:

如果你想拥有一个维护全局状态的单例,我仍然建议反对 - 你应该创建一个类,例如ApplicationState,它将所有应用程序的全局状态处理为传统模型 - 视图 - 控制器模式中的模型对象。我不会在这里详细说明,因为这将是谷歌搜索的高度冗余。

在Application Delegate中的某处,添加一个ivar ApplicationState *state和一个相应的@property(以及实现文件中的@synthesize)。

答案 1 :(得分:1)

与使用全局变量相比,用脚射击自己的方法比较简单。

你永远不应该像对应用程序中的每个对象都没有访问控制权的字符串那样暴露一个哑对象。当应用程序变大时,应用程序中任何位置的任何随机代码都可以更改可变字符串,从而导致混乱。

通常当人们想要一个全局变量时,他们实际需要的是用户默认值或数据模型。

用户默认值(NSUserDefaults)是首选项持久性系统,可在启动之间和应用程序运行时保存应用程序状态和用户设置。您可以在默认值中停放少量数据,例如字符串,并可以从应用程序的任何位置轻松访问它们。

数据模型是专用对象,它保存应用程序数据并管理对它的访问,以便只有数据模型具有最终控制权。这样可以很容易地分辨出改变数据的方式和方式。数据模型可以是简单的自定义类或精心设计的内容,例如核心日期。您可以将数据模型停放在应用程序委托中,也可以将其创建为单例,如其他人所解释的那样。

我多年来一直在使用Apple API,我从来不需要使用真正的全局变量。如果您认为自己需要,可能会误解Apple API中的应用程序设计。您可能希望发布一个问题,解释您尝试使用全局变量做什么,以及在没有使用全局变量的危险的情况下应该采取的最佳策略。

答案 2 :(得分:0)

你是否需要每个班级的实例?如果是这样,您应该将其设为实例变量。把

NSMutableString *string;

在标题中

然后你可以在你班上的任何方法中设置它。

如果这不是您的意思,请更新您的问题或评论。

答案 3 :(得分:0)

您可以通过在委托类中实现getter和setter来实现这一目标。

在委托.h文件中

包括UIApplication委托

 @interface DevAppDelegate : NSObject <UIApplicationDelegate>

  NSString * currentTitle;

 - (void) setCurrentTitle:(NSString *) currentTitle;
 - (NSString *) getCurrentTitle; 

在Delegate实现类.m

 -(void) setCurrentLink:(NSString *) storydata{
currentLink = storydata;

}

-(NSString *) getCurrentLink{
if ( currentLink == nil ) {
    currentLink = @"Display StoryLink";
}
return currentLink;
}

因此,要评估的变量是通过setters方法和类在currentlink字符串中设置的,只需使用getter方法。

AppDelegate *del=(AppDelegate *)[[UIApplication sharedApplication]delegate];
TO set:
[del setCurrentLink];
TO Get:
NSString *value=[del getCurrentLink];

一切顺利

答案 4 :(得分:0)

添加:

NSMutableString *globalString = nil;

到任何对象的任何.m文件。 nil初始化增加了一点安全性,因为nil对象可以“安全地”发送消息而不会直接崩溃应用程序。

添加:

extern NSMutableString *globalString;

到需要访问此全局的任何其他对象的标头。

添加:

if (globalString == nil) {
    globalString = [ [ NSMutableString stringWithFormat:@"text"] retain ];
}

到任何可能是第一个触及这个全局的类的init,或者甚至更早发生的某个init。

Globals是一种不那么冗长的单身形式,但没有访问限制或跟踪。请谨慎使用。

答案 5 :(得分:0)

实际上,根据我的r&amp; di得到的,通过使用extern,我们必须创建一个实例,但最后的事情是#define你的变量并且可以访问任何你想要的地方,而不需要创建实例和其他东西直接使用变量名称....