Примечание: ниже используется 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: ошибка: проблема с автоматическим подсчетом ссылок»: существующий «делегат» ивара для свойства unsafe_unretained «делегат» должен быть __unsafe_unretained »
Если я изменяю FileListViewController.h, добавляя __ слабый и (слабый)) затем он запустится.
@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];
}
Мои вопросы:
- Почему в make (слабый) и __weak в makeэто работает?Я не понимаю, почему это работает, поскольку я нашел это, гуглял, и не было никакого объяснения.
- Почему я не могу установить свой делегат с помощью этого '[fileListViewController setDelegate: self];'?Похоже, что компилятор не знает, что «делегат» существует.