Objective c 强大的物体会在赛格被摧毁吗?
我有一个iPhone应用程序,它有一个表视图和导航栏中的“添加”按钮。表视图有一个自定义的Objective c 强大的物体会在赛格被摧毁吗?,objective-c,ios,uitableview,memory-management,segue,Objective C,Ios,Uitableview,Memory Management,Segue,我有一个iPhone应用程序,它有一个表视图和导航栏中的“添加”按钮。表视图有一个自定义的NSObject,它保存了名为数据库的数据数据库是此表视图的(强、非原子)属性。表视图有一个公共方法,允许将新数据添加到数据库中。单击“添加”按钮后,会出现一个新视图的序列,可用于设置新单元格的相同值。点击保存按钮时,另一个segue用于调用public方法,将信息添加到数据库中。但是,当调用第二个segue时,原始的数据库对象就消失了,这意味着数据库中只有一个项目。这是赛格的预期吗?为了使对象保持活动状态
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正在删除对对象的引用,但事实并非如此。谢谢你的单身建议,我会考虑在我的应用程序中使用一个。作为后续问题,是否有任何理由只传递这个数据库对象,而不是将其设置为单例对象(即为什么要使用单例)?再次感谢你的帮助。单身不一定是最好的选择。你应该决定什么更适合你的情况。然而,使用单例的一个很好的例子是一个为整个程序服务的对象,它可以在多个地方使用。有时,这样做会使代码更干净、更易于维护。