Obj-C:将指针传递给其他类中的初始化类

时间:2010-06-07 22:54:22

标签: iphone objective-c pointers

我在我的单例中初始化了一个名为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,但它永远不会进入控制台。

有什么想法吗?

1 个答案:

答案 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>