所以我一直在做很多阅读。我终于能够声明一个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(不想这样做)。只是尝试通过添加和操作多个视图中的数组来提高效率。
谢谢你们!
答案 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)