2010-09-05 24 views
0

我想使用NSMutableDictionary來緩存稍後將使用的一些數據。我的自定義對象是以下幾點:NSMutableDictionary錯誤

@interface MyData : NSObject { 
    NSRange range; 
    NSMutableArray *values; 
} 
@property (nonatomic, retain) NSMutableArray *values; 

和實施:

- (id)init { 
    if (self = [super init]) { 
     values = [[NSMutableArray alloc] init]; 
    } 

    return self; 
} 

,當我想緩存它,我用它是這樣的:

NSMutableDictionary *cache = [[NSMutableDictionary alloc] init]; 
NSString *key = @"KEY"; 
MyData *data = [[MyData alloc] init]; 
// save some data into data 
[data.values addObject:"DATA1"]; 
[data.values addObject:"DATA2"]; 
//... ... 
[cache setObject:data forKey:key]; 

我的問題是高速緩存的計數.values爲零時,我稍後檢索此對象如下:

[cache objectForKey:@"KEY"]; 

我可以檢索「數據」,當我將它放入緩存時,對象的內存地址與地址相同。 有什麼不對?我需要一些善良的人幫助,任何信息都是有幫助的。謝謝

+0

'addObject:「DATA1」'不應該工作 - 是一個錯字? – 2010-09-05 03:46:20

+0

你在這裏期待什麼?如果你把一個對象放到NSDictionary中,然後再檢索它,它應該是同一個對象。 – 2010-09-05 03:52:01

回答

0

正如Carl Norum指出的那樣,您將C字符串傳遞給addObject:。顧名思義,addObject:需要一個指向Cocoa對象的指針; C字符串是指向字符的指針。你需要在那裏傳遞NSString對象;對於字面字符串,這隻需要在@前加上前綴:"Fred"是一個常量C字符串,而@"Fred"是一個常量NSString對象。

cache的一個實例變量?它看起來不是;它似乎是一個局部變量,這意味着你每次都創建一個新的字典對象。這就是爲什麼你之前沒有添加任何東西(以前的字典)。這也意味着你泄露了以前的字典,因爲你沒有發佈它們(不管你展示的代碼是什麼)。

使cache成爲一個實例變量,並且只有當您還沒有一個實例變量時才創建該字典(即,當時爲cache == nil)。在您的init方法中創建字典是一種好方法。並確保你manage its lifetime appropriately,所以你不會泄漏和/或崩潰。

0

首先你的對象添加不正確它應該有一個@之前的字符串。像@「DATA1」

其次,當您將一個對象添加到字典或數組中時,它不會生成它的實際副本。它只是創建一個指向它的指針,所以如果這些對象被銷燬或移動到某個地方,它們也會從你的字典中消失。一個更好的方法,使您的值的緩存是將對象複製像這樣:

MyData* cache = [[MyData alloc] init]; 

for (int i = 0; i < [data.values count]; i ++){{ 
    [cache.values addObject:[NSString stringWithString:[data.values objectAtIndex:i]]]; 
} 

不要使用字典在這種情況下。

+0

是的,謝謝你的幫助,我以後再也不用保護var了。在你回答之後,我很清楚指針。所以再次感謝你。 – Apollo 2010-09-23 07:51:31

相關問題