2012-07-10 101 views
1

我對iOS沒有太多的經驗,但我正在研究一些遺留代碼。在該項目中,我們使用一個對象作爲字典的關鍵字:iOS是否更改對象的引用?

NSMutableDictionary * dict; 
RoleContainer * role = [Class getRole]; 
[dict setObject:[Class getData] forKey:role]; 

我們已將角色傳遞給另一個函數。當我們嘗試檢索數據時:

data = [dict objectForKey:role]; 

有時返回值爲空。它約有10%的時間發生。我遍歷代碼,並在將角色傳遞給函數後發現「角色」對象的引用已被更改!例如,從0x002bf500到0x00222bad。

爲什麼?

+0

什麼是'Class'?強烈建議您不要使用'Class'作爲您自己的類或實例的名稱。但我懷疑你的問題是你沒有使用ARC,而你沒有保留一些對象。 – 2012-07-10 19:37:03

+0

類只是一個假名,所以它沒關係。但我認爲你正在進行一些工作,因爲我不知道保留是什麼......讓我做一些研究。謝謝, – 2012-07-10 19:48:38

+1

在理解存儲模型之前,您至少在基本級別上都無法用Objective-C做任何事情。 – 2012-07-10 19:51:03

回答

2

爲了更好地玩NSMutableDictionary您的RoleContainer類必須實現hashisEqual方法。否則,平等角色可能會在字典中記錄兩次,或通過有效密鑰查詢可能會失敗。

這裏是你如何執行一個簡短的樣本您hash當你的類有一個識別部件/ isEqual

@interface RoleContainer : NSObject 
@property (nonatomic, readonly) NSString *name; 
- (NSUInteger)hash; 
- (BOOL)isEqual:(id)anObject; 
@end 

@implementation RoleContainer 
@synthesize name = _name; 
- (NSUInteger)hash { 
    return [name hash]; 
} 

- (BOOL)isEqual:(id)anObject { 
    if (![anObject isKindOfClass:[RoleContainer class]]) { 
     return NO; 
    } 
    RoleContainer *other = (RoleContainer*)anObject; 
    return [_name isEqual:[other name]]; 
} 
@end 
1

嘗試NSMutableDictionary * dict = [NSMutableDictionary dictionary];

而且這將是有意義的看看你的Class。它是一個類,getRole是一個類方法嗎?它是一個對象嗎?

1

在該代碼中,dict將爲零,因此您將消息發送至無。它實際上是指向以後的事嗎?

我假設你的RoleContainer對stringValue方法做出了響應,這可能是一個很好的地方,看看它是否過載會發生什麼。

如果它使用標準字符串值,那麼它將返回類和內存位置。如果某人下線將對象重置爲密鑰,這可能不可靠。

您可能還有一個問題,getData對象被釋放到某處不應觸及的地方。在調試器中嘗試enablingNSZombieEnabled,或啓用ARC。

相關問題