我有一个带有桌面视图的iPhone应用程序和导航栏中的添加按钮。表格视图有一个自定义NSObject
,用于保存名为dataBase
的数据。 dataBase
是此表格视图的(strong, nonatomic) @property
。表视图有一个公共方法,允许将新数据添加到dataBase
。单击添加按钮时,会有一个新视图的segue,可以设置新单元格的相同内容。在点击保存按钮时,另一个segue用于调用将信息添加到dataBase
的公共方法。但是,当调用第二个segue时,原始dataBase
对象消失了,这意味着dataBase
中只有一个项目。这是与segues一起预期的吗?为了保持对象存活,我需要传递对象本身吗?
很抱歉,如果这是一个非常noob的问题,我是iOS编程和引用计数内存管理的新手。
答案 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
代码除了使其成为线程安全之外,还将确保创建代码只运行一次。函数内部的静态对象将保留对对象的引用,因此它永远不会被释放...并且在程序的整个生命周期中都存在。
这是处理这种情况的一种常见模式,但还有很多其他模式。关键是如果你想要一个对象存在,你必须保持对它的引用。将其传递给每个视图控制器,或将其保存在常见的"放置,或在不需要时将其存档到磁盘,并在需要时重新补充...有很多方法可以做到......