Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 强大的物体会在赛格被摧毁吗?_Objective C_Ios_Uitableview_Memory Management_Segue - Fatal编程技术网

Objective c 强大的物体会在赛格被摧毁吗?

Objective c 强大的物体会在赛格被摧毁吗?,objective-c,ios,uitableview,memory-management,segue,Objective C,Ios,Uitableview,Memory Management,Segue,我有一个iPhone应用程序,它有一个表视图和导航栏中的“添加”按钮。表视图有一个自定义的NSObject,它保存了名为数据库的数据数据库是此表视图的(强、非原子)属性。表视图有一个公共方法,允许将新数据添加到数据库中。单击“添加”按钮后,会出现一个新视图的序列,可用于设置新单元格的相同值。点击保存按钮时,另一个segue用于调用public方法,将信息添加到数据库中。但是,当调用第二个segue时,原始的数据库对象就消失了,这意味着数据库中只有一个项目。这是赛格的预期吗?为了使对象保持活动状态

我有一个iPhone应用程序,它有一个表视图和导航栏中的“添加”按钮。表视图有一个自定义的
NSObject
,它保存了名为
数据库的数据
数据库
是此表视图的
(强、非原子)属性
。表视图有一个公共方法,允许将新数据添加到数据库中。单击“添加”按钮后,会出现一个新视图的序列,可用于设置新单元格的相同值。点击保存按钮时,另一个segue用于调用public方法,将信息添加到
数据库中。但是,当调用第二个segue时,原始的
数据库
对象就消失了,这意味着
数据库
中只有一个项目。这是赛格的预期吗?为了使对象保持活动状态,是否需要传递对象本身


很抱歉,如果这是一个很难回答的问题,我对iOS编程和引用计数内存管理还不熟悉。

这与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\u once
功能确保了多线程应用程序的正确性(所有iOS应用程序都应该是这样的)

现在,当您需要“共享”
数据库
对象时

Database *database = [Database sharedInstance];
dispatch_once
代码除了确保线程安全外,还将确保创建代码只运行一次。函数中的静态对象将保留对该对象的引用,因此它永远不会被释放。。。在节目的整个生命周期中都能活着


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

这与序列无关,所以不要把问题搞混了

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

因此,如果希望对象保持“活动”,则需要以某种方式保持对它的引用。如果希望数据库在程序的生命周期内一直存在,通常的模式是使用“单例”对象。这可以通过多种方式实现。一种简单的方法是模拟常见的单例模式:

@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\u once
功能确保了多线程应用程序的正确性(所有iOS应用程序都应该是这样的)

现在,当您需要“共享”
数据库
对象时

Database *database = [Database sharedInstance];
dispatch_once
代码除了确保线程安全外,还将确保创建代码只运行一次。函数中的静态对象将保留对该对象的引用,因此它永远不会被释放。。。在节目的整个生命周期中都能活着


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

谢谢您提供的信息。我以为segue正在删除对对象的引用,但事实并非如此。谢谢你的单身建议,我会考虑在我的应用程序中使用一个。作为后续问题,是否有任何理由只传递这个数据库对象,而不是将其设置为单例对象(即为什么要使用单例)?再次感谢你的帮助。单身不一定是最好的选择。你应该决定什么更适合你的情况。然而,使用单例的一个很好的例子是一个为整个程序服务的对象,它可以在多个地方使用。有时候,这样做会使代码更干净、更易于维护。谢谢您提供的信息。我以为segue正在删除对对象的引用,但事实并非如此。谢谢你的单身建议,我会考虑在我的应用程序中使用一个。作为后续问题,是否有任何理由只传递这个数据库对象,而不是将其设置为单例对象(即为什么要使用单例)?再次感谢你的帮助。单身不一定是最好的选择。你应该决定什么更适合你的情况。然而,使用单例的一个很好的例子是一个为整个程序服务的对象,它可以在多个地方使用。有时,这样做会使代码更干净、更易于维护。