gpt4 book ai didi

objective-c - 无法在 iOS 上使用自定义@protocol

转载 作者:太空狗 更新时间:2023-10-30 03:47:03 32 4
gpt4 key购买 nike

注意:以下是使用启用了自动引用计数 (ARC) 的 iOS。我认为 ARC 可能与它无法正常工作的原因有很大关系,因为这是根据我通过谷歌找到的示例设置的。

我正在尝试创建一个协议(protocol)来通知委托(delegate)人用户从 UITableView 中选择的文件名。

文件 ListView Controller .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

文件 ListView Controller .m

#import "FileListViewController.h"

@implementation FileListViewController

@synthesize fileList;
@synthesize delegate;

这在

处给出了一个错误
@synthesize delegate;

行是“FileListViewController.m: error: Automatic Reference Counting Issue: existing ivar 'delegate' for unsafe_unretained property 'delegate' must be __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

但是当我尝试设置委托(delegate)时,应用程序崩溃了。名为“ImportViewController”的 View 正在从“FileListViewController”创建一个 View 并将委托(delegate)设置为自身 (ImportViewController),以便我可以实现我的自定义协议(protocol)“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 可以让它发挥作用?我不理解为什么这是有效的,因为我发现它在谷歌上搜索并且没有解释。
  • 为什么我不能用这个来设置我的委托(delegate)'[fileListViewController setDelegate:self];' ?好像是编译器不知道“委托(delegate)”的存在。

最佳答案

在 ARC 下,ivars 默认为 strong .所以报错

Automatic Reference Counting Issue: Existing ivar 'delegate' for unsafe_unretained property 'delegate' must be __unsafe_unretained"

告诉你你已经用 __unsafe_unretained 声明了一个属性(分配)所有权,其中基础 ivar 具有 __strong所有权,这是非法的。为避免错误,您有 3 个选择:

  1. 省略 ivar。没有必要为合成属性声明一个 ivar。 ivar 将以与您的属性(property)相匹配的所有权隐式声明。
  2. 定义 ivar 以匹配您的(分配)属性声明:__unsafe_unretained id <FileListDelegate> delegate;
  3. 定义属性以匹配 ivar 的隐式 __strong 所有权:@property (weak) id <FileListDelegate> delegate;

就个人而言,我会省略 ivar 声明,这样您就可以在属性声明的一个地方拥有所有权语义。

关于objective-c - 无法在 iOS 上使用自定义@protocol,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6773295/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com