我在我的单例中初始化了一个名为DataModel的类。现在,从我的UIViewController,当我单击一个按钮时,我有一个方法试图访问该类,以便我可以将一个对象添加到其中一个字典。我的get / set方法从我的单例传回指向类的指针,但当我回到我的UIViewController中时,传回的类不响应方法。它就像它不在那里。我认为这与在类或类似物周围传递指针的区别有关。我甚至尝试使用复制方法将副本丢回,但没有运气。
的UIViewController:
ApplicationSingleton *applicationSingleton = [[ApplicationSingleton alloc] init];
DataModel *dataModel = [applicationSingleton getDataModel];
[dataModel retrieveDataCategory:dataCategory];
的Singleton:
ApplicationSingleton *m_instance;
DataModel *m_dataModel;
- (id) init {
NSLog(@"ApplicationSingleton.m initialized.");
self = [super init];
if(self != nil) {
if(m_instance != nil) {
return m_instance;
}
NSLog(@"Initializing the application singleton.");
m_instance = self;
m_dataModel = [[DataModel alloc] init];
}
NSLog(@"ApplicationSingleton init method returning.");
return m_instance;
}
-(DataModel *)getDataModel {
DataModel *dataModel_COPY = [m_dataModel copy];
return dataModel_COPY;
}
对于getDataModel方法,我也试过这个:
-(DataModel *)getDataModel {
return m_dataModel;
}
在我的DataModel retrieveDataCategory方法中,我无法正常工作。我甚至只是尝试在那里放置一个NSLog,但它永远不会进入控制台。
有什么想法吗?
答案 0 :(得分:1)
您很可能会发送被忽略的邮件,例如它们被发送到不存在的对象/不是你正在寻找的对象,并且由于某种原因不会崩溃。这发生在消息传递nil或可能是其他非法值的情况下。虽然你似乎期望m_变量将初始化为0,但这不是一个好的形式,而且你没有遵循一个非常典型的单例的objc模式 - m_dataModel应该是m_instance的ivar,并且m_instance应该是声明为static,因为可能不希望直接从其他文件访问它。另外,你的bug的最可能的来源是-init方法,它永远不应该在单例上调用 - 而是做这样的事情:
+ (ApplicationSingleton *)sharedInstance {
static ApplicationSingleton *instance = nil;
if(!instance) {
instance = [[self alloc] init]; //or whatever custom initializer you would like, furthermore some people just put the initialization code here and leave -init empty
}
return instance;
}
您现在泄漏的代码因为您分配了一个对象(self)并且在返回可能不同的实例(共享的实例,如果已经存在)之前不释放它,这样新分配的实例通常会丢失。 / p>