извините, если этот вопрос уже возник, но я не смог найти ничего, что решило бы конкретную проблему, с которой я столкнулся.
Я работаю в target-c на iOS, и я объявил переменную экземпляра NSMutableDictionary, свойство для него, синтезировал его и выделил для него место в моем методе init:
SettingsViewController.h
@interface SettingsViewController : UITableViewController <UIAlertViewDelegate> {
NSMutableDictionary *settingsData;
UISwitch *emailSwitch;
UISwitch *phoneSwitch;
NSMutableData *receivedData;
}
@property (nonatomic, retain) NSMutableDictionary *settingsData;
@property (nonatomic, retain) UISwitch *emailSwitch;
@property (nonatomic, retain) UISwitch *phoneSwitch;
@property (nonatomic, retain) NSMutableData *receivedData;
SettingsViewController.m метод инициализации
@synthesize settingsData, emailSwitch, phoneSwitch, receivedData;
# the initialization method, where settingsData is allocated
- (id)initWithStyle:(UITableViewStyle)style {
self = [super initWithStyle:style];
if (self) {
self.navigationItem.title = @"Settings";
[[self navigationItem] setRightBarButtonItem:[[[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(doneEditing:)] autorelease]];
settingsData = [[NSMutableDictionary alloc] init];
}
return self;
}
Зелье метода в SettingsViewController.m, который использует settingsData (это просто очень простой анализатор для блока данных, отформатированный ключ = значение &):
NSMutableString *element = [NSMutableString string];
NSMutableString *value = [NSMutableString string];
bool cap_element = true;
char index;
for (int i = 0; i < [response length]; i++) {
index = [response characterAtIndex:i];
if (cap_element && index != '=') {
[element appendFormat:@"%c", index];
continue; // skip back to the top
}
if (index == '=') {
cap_element = false;
continue;
}
if (!cap_element && index != '&') {
[value appendFormat:@"%c", index];
continue;
}
if (index == '&') {
// store the value in the dict and move onto the next element
# this output is always correct...
NSLog(@"Key:%@, Value:%@", element, value);
[self.settingsData setObject:value forKey:element];
# ...as is this (the value printed above matches the result here)
NSLog(@"Result:%@", [settingsData objectForKey:element]);
[value setString:@""];
[element setString:@""];
cap_element = true;
}
# but this will output an empty string (username prints correctly above)
NSLog(@"%@", [self.settingsData objectForKey@"username"]);
Первые 2 комментария NSLog () выводятся, как и ожидалось, но как только я ухожу из цикла for, все ключи остаются, и их значения становятся пустыми строками (поэтому выходные данные читают username = "" вместо username = "tester") , Я бы понял это, если бы словарь не был инициализирован, но я позабочусь об этом в методе init, показанном выше. Чего мне не хватает?