【问题标题】:Do strong objects get destroyed on segue?坚固的物体会在segue上被破坏吗?
【发布时间】:2012-10-11 16:11:45
【问题描述】:

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

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

【问题讨论】:

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


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

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

    【讨论】:

    • 感谢您的信息。我认为 segue 正在删除对对象的引用,但事实并非如此。感谢您的单身建议,我会考虑在我的应用程序中使用一个。作为后续问题,是否有任何理由只传递此数据库对象而不是使其成为单例(即为什么要使用单例)?再次感谢您的帮助。
    • 单身人士不一定是要走的路。您应该决定什么更适合您的情况。然而,使用单例的一个很好的例子是为整个程序存在的单个对象,并在多个地方使用。有时,这样做会使代码更简洁、更易于维护。
    猜你喜欢
    • 1970-01-01
    • 2013-12-02
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 2020-02-15
    • 2019-02-23
    • 1970-01-01
    • 2018-09-05
    相关资源
    最近更新 更多