2010-06-07 51 views
0

我在名爲DataModel的單例中初始化了一個類。現在,從我的UIViewController,當我點擊一個按鈕時,我有一個方法試圖訪問該類,以便我可以添加一個對象到它的一個字典。我的get/set方法從我的singleton傳回指向類的指針,但是當我回到UIViewController時,返回的類不響應方法。就像它不在那裏。我認爲這與傳遞類或類似內容的差異有關。我甚至嘗試使用複製方法來丟棄一個副本,但沒有運氣。Obj-C:將指針傳遞給其他類中的初始化類

的UIViewController:

ApplicationSingleton *applicationSingleton = [[ApplicationSingleton alloc] init]; 

DataModel *dataModel = [applicationSingleton getDataModel]; 

[dataModel retrieveDataCategory:dataCategory]; 

辛格爾頓:

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

一個簡單的事情來檢查:確保你的對象不是零,因爲一個消息到零是無操作 – cobbal 2010-06-07 23:04:07

+0

哦,我的DataModel * m_dataModel不是零。在我爲該類的init方法中,我有一大堆NSLogs來證明它。 ;)所以,它是活着的,它充滿了東西。就在我將初始化類從單例傳遞迴UIViewController時,UIViewController無法調用DataModel上的任何方法。 – FnGreg7 2010-06-07 23:06:38

+0

我假設'm_instance'和'm_dataModel'沒有在'@ interface'中聲明爲ivars,並且這些聲明在實現文件中? – 2010-06-08 00:31:05

回答

1

很可能您發送的郵件被忽略,例如,他們被髮送到不存在的對象/不是你正在尋找的對象,並且由於某種原因不會崩潰。這發生在消息無消息或可能其他非法值的情況下。雖然你似乎預計m_變量將被初始化爲0,但這不是一個好的形式,而且你沒有遵循一個非常典型的objc模式 - m_dataModel應該是m_instance的ivar,並且m_instance應該可能是宣佈爲靜態,因爲你可能不希望它直接從其他文件訪問。此外,你的錯誤的最可能的來源是某種-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; 
} 

你現在有代碼泄漏,因爲你分配一個object(self),並且在返回一個潛在不同的實例(共享的,如果已經存在的)之前不釋放它,這樣新分配的實例通常會丟失。

+0

保證實例變量將被初始化爲0.假設事物是語言的一部分是非常好的形式,很像我們假設1 + 3將是4. – Chuck 2010-06-07 23:30:16

+0

我的措辭很差 - 我的意思是表達它不是特別清楚,因此總的來說是一種不好的做法,雖然在技術上不是錯誤的。此外,因爲變量沒有被聲明爲靜態的,如果代碼中的其他地方(大概是在不同的文件中,在文件範圍內),如果有一個靜態初始化變量的聲明,那麼變量不會是0, (不管他們是在代碼中其他地方初始化的)。雖然這不太可能發生,但它更多的是一種最佳實踐,比如讓單身ivars成爲真正的ivars,而不僅僅是靜態變量。 – 2010-06-07 23:58:25

+1

@Chuck:那些看起來不像我的ivars,他們似乎在執行文件中。@Jared:如果某人不清楚ivars是否被初始化爲0,那麼該人應該回去閱讀關於該語言的基礎知識:) – 2010-06-08 00:27:01