Не удается настроить пользовательский @protocol, работающий на iOS

Примечание: ниже используется iOS с включенным автоматическим подсчетом ссылок (ARC). Я думаю, что ARC может иметь прямое отношение к тому, почему он не работает, поскольку он настроен в соответствии с примерами, которые я нашел через Google.

Я пытаюсь создать протокол для уведомления делегата о имени файла пользователя выбирает из UITableView.

FileListViewController.h

@protocol FileListDelegate <NSObject>
- (void)didSelectFileName:(NSString *)fileName;

@end

@interface FileListViewController : UITableViewController
{
    @private
        NSArray *fileList;
        id <FileListDelegate> delegate;
}
@property (nonatomic, retain) NSArray *fileList;
@property (nonatomic, assign) id <FileListDelegate> delegate;

@end

FileListViewController.m

#import "FileListViewController.h"

@implementation FileListViewController

@synthesize fileList;
@synthesize delegate;

Это дает ошибку в строке

@synthesize delegate;

, которая представляет собой «FileListViewController.m: error: Проблема автоматического подсчета ссылок: существующий ivar 'делегат' для Свойство unsafe_unreolated 'delegate' должно быть __unsafe_unrehibited "

Если я изменю FileListViewController.h, поставив __weak и (weak), то он будет запущен.

@protocol FileListDelegate <NSObject>
- (void)didSelectFileName:(NSString *)fileName;

@end

@interface FileListViewController : UITableViewController
{
    @private
        NSArray *fileList;
        __weak id <FileListDelegate> delegate;
}
@property (nonatomic, retain) NSArray *fileList;
@property (weak) id <FileListDelegate> delegate;

@end

Но когда я пытаюсь установить делегат, приложение вылетает. Представление под названием «ImportViewController» создает представление из «FileListViewController» и устанавливает делегата для себя (ImportViewController), чтобы я мог реализовать свой собственный протокол «didSelectFileName». Я получаю следующее сообщение об ошибке:

* Завершение работы приложения из-за неперехваченного исключения 'NSInvalidArgumentException', причина: '- [ImportViewController setDelegate:]: неопознанный селектор отправлен на экземпляр 0x6c7d430'

Я выполняю код;

ImportViewController.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    FileListViewController *fileListViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"filelist"];

    [fileListViewController setDelegate:self];
    [self.navigationController pushViewController:fileListViewController animated:YES];

}

У меня следующие вопросы:

  • Почему включение (weak) и __weak заставляет его работать? Я не понять, почему это работает, поскольку я нашел это в Google, и не было объяснение.
  • Почему я не могу настроить своего делегата с помощью этого '[fileListViewController setDelegate: self];' ? Похоже, что компилятор не знает, что существует «делегат».
5
задан zio 21 July 2011 в 08:34
поделиться