和extern NSMutableArray有什么问题?

时间:2010-06-21 04:39:41

标签: iphone objective-c sdk nsmutablearray

所以我一直在做很多阅读。我终于能够声明一个extern MutableArray并从不同的Views中访问它。我有两种看法: 1)测试视图控制器 2)Test2

我声明数组如下: TestingViewController.h

extern NSMutableArray *myArray;

#import <UIKit/UIKit.h>

@interface TestingViewController : UIViewController {

}

我在TestingViewController加载时初始化数组。 然后我可以从测试2添加对象,如下所示: Test2.m

#import "Test2.h"

NSMutableArray *myArray;
@implementation Test2

-(IBAction)addToArray{
 [myArray addObject:@"Hot like Mexico"];
 NSLog(@"Object was added to Array! Count: %d",[myArray count]);
}

它似乎在两个视图中都有效。即使在切换时,计数和对象也是一致的。

我想知道的是,这有什么问题?我知道很多有经验的程序员都讨厌全局变量,但是我使用它的唯一方法就是上面和通过AppDelegate(不想这样做)。只是尝试通过添加和操作多个视图中的数组来提高效率。

谢谢你们!

4 个答案:

答案 0 :(得分:2)

如果你真的需要一个“全局”对象,这里有一个我用得很多的简单模式 - 好吧,不是很多,因为我不会有很多全局变量。

确定您希望它属于哪个类。假设Test2是将它放入的逻辑类。在Test2中创建一个方法来访问变量。 (可以是类方法或实例方法)如下:

@interface Test2 : NSObject
{
    // ivars
}

+(NSMutableArray*) myArray;  // could also be an instance method

@end

@implementation Test2

+(NSMutableArray*) myArray
{
    static NSMutableArray* theValue = nil;
    @synchronized([Test2 class]) // in a single threaded app you can omit the sync block
    {
        if (theValue == nil)
        {
            theValue = [[NSMutableArray alloc] init];
        }
    }
    return theValue;
}
@end

编辑:使用类方法,从任何地方访问myArray只需执行以下操作:

#import "Test2.h"

// To use class method, send messages to the class itself

[[Test2 myArray] addObject: @"foo bar"];
id foo = [[Test2 myArray] objectAtIndex: 0];

答案 1 :(得分:1)

全局变量的问题在于它们在扩散。首先你有一个,然后你需要另一个,在你知道它之前,你已经有了几十个全局变量,你不确定变量在哪里被初始化和释放,每个变化都需要永远,因为你不知道组件之间的依赖关系是什么。

通常,您需要为程序中的每个资源设置一个已标识的所有者。在Cocoa应用程序中,各种控制器和委托对象为设计的各个部分提供了自然的责任层次。


对于您需要在应用程序的多个视图中访问的对象的特定情况,您通常可以通过视图控制器类的方法使该对象可用,然后确保每个视图都有一个引用回到控制器。

例如,查看UITableView的任何示例。这里使用了一个相当复杂的数据源协议,但是其他UIKit类具有“委托”属性,该属性通常被初始化为一个对象,该对象管理它们的某些状态。

答案 2 :(得分:1)

当涉及到内存管理时,全局变量是噩梦,这实际上不是在设计方面做事的典型方式。正确的方法是在myArray中将TestingViewController声明为属性,然后从Test2访问该属性。

答案 3 :(得分:1)