2011-01-27 3 views
0

Im, использующий словарь для сохранения некоторых позиций со значением «1»;Ошибка при сбое с использованием NSDictionary - Iphone SDK

/* * * header * * */ 

NSDictionary *Mypoints; 

/* * * * * * * * */ 

-(void)myfunc: (float)y :(float)x{ 

    NSLog(@"%@",Mypoints); 

    NSNumber *one = [NSNumber numberWithInt:1]; 
    NSString *key = [[NSString alloc] initWithFormat:@"%f,%f",y,x]; 

    [Mypoints setObject:one forKey:key]; 

    //show the value 
    NSNumber *tempNum = [Mypoints objectForKey:key]; 
    int i = tempNum.intValue; 
    NSLog(@"Value: %i",i); 

    //print all 
    NSLog(@"%@",Mypoints); 

} 

Первый раз, когда я называю эту функцию, все в порядке, он создает словарь и распечатать «массив» в последней строке. Но когда я снова вхожу в эту функцию, она вылетает без ошибок.

Я не знаю, что может происходить ...

Я решил аварии, делая это:

Mypoints = [[NSMutableDictionary dictionaryWithObject:one forKey:key]retain]; 

Я решил, как добавить больше очков:

// в viewDidLoad

Mypoints = [[NSMutableDictionary alloc] init]; 

// в MyFunc

[Mypoints setObject:one forKey:key]; 

ответ

2

Mypoints не сохраняется. Поэтому в первый раз это будет ноль, во второй раз Mypoints укажут на память, которая была освобождена.

Другие незначительные проблемы в этом коде:

  1. MyPoints должен быть установлен в ноль перед использованием (я предполагаю, что это будет сделано в другом месте).
  2. Mypoints = [Словарь NSDictionaryWithObject: один forKey: key]; В вашем словаре также будет только одна пара ключ/значение, потому что вы каждый раз создаете новый словарь.
  3. NSString * key = [[NSString alloc] initWithFormat: @ "% f,% f", y, x]; Это будет протекать, поскольку оно не будет выпущено.

// Not keen on this being a global but whatever... It needs to be initialised somewhere in this example. NSMutableDictionary* Mypoints = nil;

-(void)myfunc: (float)y :(float)x {
// This is hacky but shows the principle. if (Mypoints == nil) { Mypoints = [ NSMutableDictionary alloc ] initWithCapacity: 10 ]; // Or whatever you think the size might be. Don't forget to release it somewhere. }

NSNumber *one = [NSNumber numberWithInt:1]; NSString *key = [NSString stringWithFormat:@"%f,%f",y,x]; // This stops the leak since it is now already autoreleased. [ MyPoints setObject: one forKey: key ]; // Be careful no other key can have the same x and y value. //show the value NSNumber *tempNum = [Mypoints objectForKey:key]; int i = tempNum.intValue; NSLog(@"Value: %i",i); //print all NSLog(@"%@",Mypoints);

}

+0

А потом ... как я могу добавить больше «очков» каждый раз, когда я вхожу в эту функцию ??? – HispaJavi

+0

Вы должны использовать NSMutableDictionary и - (void) setObject: (id) anObject forKey: (id) aKey – martinws

+0

Не могли бы вы объяснить мне, где я должен это делать? Если вы говорите, что словарь автореализован, он будет пустым каждый раз, когда я войду в функцию? – HispaJavi

1

Поскольку [NSDictionary dictionaryWithObject:one forKey:key] возвращает автореализованный объект, который время от времени освобождается между вызовами -myfunc:. Очевидно, что авария происходит на первой строке с помощью NSLog().

+0

Как я могу решить эту проблему? – HispaJavi