Tenho um aplicativo simples para iPhone que estou aprendendo e quero ter uma variável de instância chamada urlLists
que é um NSDictionary
Eu declarei assim:
@interface MyViewController : UIViewController <UIPickerViewDataSource, UIPickerViewDelegate>{
IBOutlet UIPickerView *pickerView;
NSMutableArray *categories;
NSDictionary *urlLists;
}
@property(retain) NSDictionary *urlLists;
@end
e na implementação:
@implementation MyViewController
@synthesize urlLists;
...
- (void)viewDidLoad {
[super viewDidLoad];
categories = [[NSMutableArray alloc] init];
[categories addObject:@"Sport"];
[categories addObject:@"Entertainment"];
[categories addObject:@"Technology"];
[categories addObject:@"Political"];
NSArray *objects = [NSArray arrayWithObjects:@"value1", @"value2", @"value3", @"value4", nil];
urlLists = [NSDictionary dictionaryWithObjects:objects forKeys:categories];
for (id key in urlLists) {
NSLog(@"key: %@, value: %@", key, [urlLists objectForKey:key]);
}
}
...
@end
E, tudo isso funciona até aqui.
Eu adicionei um UIPicker ao meu aplicativo e, quando seleciono um dos itens, quero registrar o que foi escolhido e sua entrada relacionada no meu dicionário.
-(void) pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger) component {
for (id key in self.urlLists) {
NSLog(@"key: %@, value: %@", key, [urlLists objectForKey:key]);
}
}
mas recebo o antigo erro EXC_BAD_ACCESS ...
Eu sei que estou perdendo algo pequeno, mas o quê?
obrigado
EDITAR::
Acabei de consertar, adicionei um retain
depois de dictionaryWithObjects
Mas eu não sei porque eu preciso, não deveria dictionaryWithObjects
criar um objeto autorelease?
Respostas:
3 para resposta № 1o NSDictionary
foi desalocado.
Você deveria usar self.urlLists = ...
, então ele passa pelo setter, que o retém.
Omissão self
irá definir o ivar diretamente.