gpt4 book ai didi

objective-c - 对成员 'delegate' 的模糊引用

转载 作者:行者123 更新时间:2023-11-28 11:05:51 26 4
gpt4 key购买 nike

我正在尝试创建一个用 Objective-C 编写的单例类的实例。我必须遵守它的委托(delegate)协议(protocol)。 Swift 实现看起来像这样:

class SomeClass: ManagerDelegate {
let manager = Manager.sharedInstance()

func someFunction(){
manager.delegate = self
}
}

Objective-C 单例类看起来像这样:

// header
@protocol ManagerDelegate <NSObject>
@required
-(void)delegateMethod;
@end

@interface Manager : NSObject {

}
+ (id)sharedInstance;
@property (nonatomic, assign) id delegate;
@end


// class file
+ (id) sharedManager{
static Manager *theSharedManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
theSharedManager = [[self alloc] init];
});

return theSharedManager;
}

- (void) someInternalMethod{
[delegate delegateMethod];
}

在指定委托(delegate) (manager.delegate = self) 时,我收到错误

Ambiguous reference to member 'delegate'

是 Objective-C 类的格式不正确还是我的实现不正确?我还缺少其他东西吗?

最佳答案

您的问题是由 Objective-C 中的 sharedInstance 方法定义引起的。通过将其声明为

+ (id)sharedInstance;

它被转换为 sharedInstance() -> AnyObject!在 swift 。 Swift 然后不知道它可以找到您所指的许多潜在 delegate 属性中的哪一个。如果您将 Objective C 声明和实现更改为:

+ (instancetype)sharedInstance;

您的问题将会消失。

正如@rmaddy 指出的那样,您的委托(delegate)应该是weak 而不是assign。如果您使用 assign,则在委托(delegate)被释放的情况下,delegate 将被保留为无效指针。

此外,将委托(delegate)与单例一起使用有点矛盾。鉴于您将永远只有一个 Manager 实例,它可能会被许多其他对象使用,并且您一次只能有一个事件委托(delegate),因此有可能发生冲突。

我建议 block /闭包或 NSNotification 是从单例回调的更好方法。

关于objective-c - 对成员 'delegate' 的模糊引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37716276/

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