【发布时间】:2011-07-21 08:34:43
【问题描述】:
注意:以下使用启用了自动引用计数 (ARC) 的 iOS。我认为 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 属性 'delegate' 的现有 ivar 'delegate' 必须是 __unsafe_unretained”
如果我更改 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 放进去让它工作?我不 理解为什么这行得通,因为我发现它在谷歌上搜索并且没有 解释。
- 为什么我不能使用这个设置我的委托 '[fileListViewController setDelegate:self];' ?这似乎是 编译器不知道“委托”存在。
【问题讨论】:
标签: objective-c cocoa-touch protocols