segue上的强大物体会被毁坏吗?

时间:2012-10-21 19:38:56

标签: objective-c ios uitableview memory-management segue

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

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

1 个答案:

答案 0 :(得分:1)

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

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

所以,如果你想要保持一个物体并且#34;活着"那么你需要以某种方式保持对它的引用。如果您希望数据库在程序的生命周期中存在,通常的模式是使用" singleton"宾语。这可以通过多种方式实现。一种简单的方法是模仿常见的单例模式:

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

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