Доступ к проблеме NSDictionary - PullRequest
0 голосов
/ 17 июля 2011

Я только новичок в разработке для iPhone, поэтому приношу свои извинения, если это глупый вопрос.Я создаю различные приложения на основе книги, которую читаю, и одним из их предложений было создание мини-веб-браузера.Я думал, что это будет легко, но в то время как большая часть этого есть, я серьезно борюсь с NSDictionary.

У меня есть UISegmentedControl, используемый для отображения различных закладок.Имя закладки, отображаемое на кнопках UISegmentedControl, будет моим ключом, а URL - это значение, связанное с ним.

Сначала я пытаюсь объявить NSDictonary как частное (глобальноепеременная), но так как я не мог заставить его работать, я прибег к объявлению его в моем заголовочном файле следующим образом:

@property (nonatomic, retain) NSDictionary *bookmarks;

Я синтезирую его и инициализирую в viewDidLoad следующим образом:

- (void)viewDidLoad
{
    bookmarks = [NSDictionary
                 dictionaryWithObjectsAndKeys:@"http://www.microsoft.com",
                                              @"Microsoft",
                                              @"http://www.google.com",
                                              @"Google",
                                              @"http://www.apple.com",
                                              @"Apple",
                                              @"http://msdn.microsoft.com",
                                              @"MSDN", nil];
    [super viewDidLoad];
}

Затем я связал элемент управления с моим сегментированным элементом управления, и когда событие срабатывает и вызывается функция, я получаю следующий код, который называется:

- (IBAction) getShortcut:(id)sender
{
  NSString *shortcut;
  shortcut = [shortcuts titleForSegmentAtIndex:shortcuts.selectedSegmentIndex];
  NSString *url = [bookmarks valueForKey:shortcut];
  //[self navigateTo: url];
  [url release];
}

Когда кнопка изпо нажатию UISegmentedControl я извлекаю значение и сохраняю его в ярлык, а затем пытаюсь использовать переменную ярлыка в качестве ключа для извлечения связанного значения из NSDictionary «закладок», но продолжает падать NSString *url = [bookmarks valueForKey:shortcut]; и бомбы выходят из моей функции и отображают обычную ошибку EXC_BAD_ACCESS

Любая помощь будет принята с благодарностью.

T.

Ответы [ 4 ]

2 голосов
/ 17 июля 2011

У вас есть два варианта.один из них - иметь дело с ivar напрямую, как написал @Matt S.Обратите внимание, что в этом случае вам необходимо сохранить объект с достаточным количеством сохраняемых объектов.Вы используете и автоматически высвобождаете объект и вызываете ошибку.

Другой вариант - использовать уже определенное свойство:

self.bookmarks = [[NSDictionary ...]];

И свойство сохраняет его.

2 голосов
/ 17 июля 2011

Этот словарь автоматически выпущен.

Попробуйте это:

self.bookmarks = [NSDictionary dictionaryWithObjectsAndKeys...]
1 голос
/ 17 июля 2011

Проблема в том, что вы не сохраняете «закладки» в методе viewDidLoad.В документации Apple упоминается соглашение об именах: если метод инициализации начинается с «init ...», возвращаемый объект сохраняется, если нет, то вам придется делать это самостоятельно.«DictionaryWithObjectsAndKeys» возвращает и объект с сохранением счетчика 0, что означает, что после области назначения (ваш метод viewDidLoad) он сразу же освобождается снова.* после вашей инициализации и все готово.Другое решение, которое сохраняет за вас

bookmarks = [[NSDictionary alloc] initWithObjectsAndKeys ...];

И вы не должны освобождать URL в вашем действии.Он выпускается, как только вы выпускаете словарь

1 голос
/ 17 июля 2011

Вы не сохранили NSDictionary.

Do:

bookmarks = [[NSDictionary
                 dictionaryWithObjectsAndKeys:@"http://www.microsoft.com",
                                              @"Microsoft", nil] retain];
...