1

我有一个带有表格视图和导航栏中添加按钮的 iPhone 应用程序。表格视图有一个自定义NSObject保存它的数据,称为dataBase. dataBase(strong, nonatomic) @property这个表视图的一个。表视图有一个公共方法,允许将新数据添加到dataBase. 单击添加按钮时,会出现一个新视图,可让您设置与新单元格相同的视图。在点击保存按钮时,另一个 segue 用于调用公共方法,将信息添加到dataBase. 但是,当调用第二个 segue 时,原始dataBase对象消失了,这意味着dataBase. 这在 segues 中是可以预期的吗?为了使对象保持活动状态,我需要传递对象本身吗?

抱歉,如果这是一个非常菜鸟的问题,我是 iOS 编程和引用计数内存管理的新手。

4

1 回答 1

1

这与 segue 无关,所以不要自己混淆这个问题。

引用计数对象的基本处理是,只要至少有一个对该对象的引用,它就不会被释放。但是,一旦引用计数达到零,对象将被释放。

所以,如果你想让一个对象保持“活跃”,那么你需要以某种方式保持对它的引用。如果您希望您的数据库在程序的整个生命周期内都存在,通常的模式是使用“单例”对象。这可以通过多种方式实现。一个简单的方法是模仿常见的单例模式:

@interface Database : NSObject
    + (Database*)sharedInstance;
    // other stuff for your class
@end

@implementation Database
    + (Database*)sharedInstance {
        static Database *instance;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            instance = [[Foo alloc] init];
            // Any other initialization necessary...
        });
        return instance;
    }
@end

这些dispatch_once东西确保了多线程应用程序(所有iOS 应用程序都应该是)的正确性。

现在,当您需要“共享”Database对象时...

Database *database = [Database sharedInstance];

dispatch_once代码除了使其成为线程安全之外,还将确保创建代码只运行一次。函数内部的静态对象将保留对该对象的引用,因此它永远不会被释放......并且在程序的整个生命周期中都存在。

这是处理这种情况的一种常见模式,但还有许多其他模式。关键是,如果你想要一个对象存在,你必须保持对它的引用。将其传递给每个视图控制器,或将其保存在“公共”位置,或在不需要时将其存档到磁盘,并在以后需要时重新水合它……有很多方法可以做到……

于 2012-10-21T20:53:52.513 回答