Objective-C ViewController之间传值的方法

来源:互联网 发布:青铜器乐队知乎 编辑:程序博客网 时间:2024/06/05 19:29

近期开始学习iPhone程序开发,在需要在两个ViewController之间传值的时候不知如何下手。查了很多资料,发现一篇使用singleton的教学日志简单易懂:

http://www.cocoanetics.com/2009/05/the-death-of-global-variables/


以下是相应的翻译内容(略去了原作者的一些“废话”内容):

(对于在ViewController之间传值)最简单最专业的方法就是所谓的实例共享(shared instance)。基本的做法就是在最初调用的时候创建一个可以实例化这个类的单例的类方法(singleton),然后在接下来的调用中返回这个实例。

我们用一个棋盘游戏中常见的Engine类来举例说明:

Engine.h

#import @interface Engine : NSObject {NSUInteger board[100];  // c-style array} + (Engine *) sharedInstance; - (NSUInteger) getFieldValueAtPos:(NSUInteger)x;- (void) setFieldValueAtPos:(NSUInteger)x ToValue:(NSUInteger)newVal; @end

Engine.m

#import "Engine.h" @implementation Engine static Engine *_sharedInstance; - (id) init{if (self = [super init]){// custom initializationmemset(board, 0, sizeof(board));}return self;} + (Engine *) sharedInstance{if (!_sharedInstance){_sharedInstance = [[Engine alloc] init];} return _sharedInstance;} - (NSUInteger) getFieldValueAtPos:(NSUInteger)x{return board[x];} - (void) setFieldValueAtPos:(NSUInteger)x ToValue:(NSUInteger)newVal{board[x] = newVal;} @end


然后我们只需import这个类到我们的app delegate中同时加上如下几行代码:

// at the top: #import "Engine.h" Engine *myEngine = [Engine sharedInstance]; [myEngine setFieldValueAtPos:3 ToValue:1]; NSLog(@"pos 3: %d",[myEngine getFieldValueAtPos:3]);NSLog(@"pos 2: %d",[myEngine getFieldValueAtPos:2]);

你会发现你并没有alloc-init这个类,只是不断地取sharedInstance指针。实际上这个类方法在第一次调用时会创建一个实例,并将其存储在静态变量中。

你不必担心release的问题,因为所有app占用的内存空间将在其退出时被清空。但如果你想做得更好,你可以把sharedInstance的release放到app delegate的dealloc方法中。不过我发现这个dealloc其实从来没有被调用过。我猜测是因为IOS认为kill掉这个app并释放内存空间会更快速。

你还可以把其他与Engine类有关的方法和数据变量放入Engine类中。只是不要加入任何有关显示它的内容。这样Engine才能被重复使用。