-1

有很多像我这样的人正在使用这样的网站(和其他网站)自学 iOS 和 Xcode。那里有很多信息,在这些信息和我买的书之间,我学到了很多东西,我的第一个应用程序即将完成。我需要访问四个 NSMutableArray 才能将信息从一个 UIViewController 传递到另一个以在 UITableView 中显示。

问题是单例(和 appDelegate 中的全局变量)的信息是多种多样的,对于一个苦苦挣扎的程序员来说是混乱的。我在哪里可以找到关于这两种在应用程序内和跨 UIView 控制器共享信息的方式的清晰、准确和完整的信息?

谢谢。

4

2 回答 2

2

(首先我觉得有义务指出,这不是你应该用来在多个视图控制器中提供数据的方式。)

Objective-C 中没有全局变量。至少不是“应用程序范围”。您可以通过以下方式声明“文件范围”变量:

static NSArray *_array;

但是您只能在同一个文件中访问它。要使其在其他类中可访问,您必须创建类方法来执行此操作(至少据我所知):

+ (NSArray *)array
{
    return array;
}

+ (void)setArray:(NSArray *)array
{
    _array = array;
}

(当然你还需要在头文件中声明类方法。

单例模式可以这样实现:

@interface SomeClass : NSObject 

@property(nonatomic,retain)NSArray *array; 

+(SomeClass*)sharedInstance;    

@end  



@implementation SomeClass    

static SomeClass *instance =nil;    
+(SomeClass *)sharedInstance    
{    
    @synchronized(self)    
    {    
        if(instance == nil)    
        {    
            instance= [[SomeClass alloc] init];    
        }    
    }    
    return instance;    
}  

然后,您可以通过调用访问数组:

[[SomeClass] sharedInstance].array
于 2012-10-28T14:43:52.570 回答
0

您可以同时使用静态(如另一个答案)或“单例”声明,它会完成这项工作。这不是真正的单例,但它的作用如下:

AppDelegate* app = (AppDelegate*)[[UIApplication sharedApplication] delegate];
NSArray* arr1 = app.arr1;
if(!arr1) {
    // .. init the arr1 here
    NSArray* tmp = ...
    app.arr1 = tmp;
}

当然,setArr1在 AppDelegate 本身中重写方法会更好,但这取决于。

于 2012-10-28T14:54:43.447 回答