gpt4 book ai didi

ios - 强引用 `self` 使对象保持事件状态(暂时) : evil?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:55:43 30 4
gpt4 key购买 nike

我正在为 UIAlertView 创建一个包装器(我知道 UIAlertController 和一些已经存在的包装器,它也用于教育目的)。

假设它看起来像这样(非常简短的版本):

@interface MYAlertView : NSObject
-(void)show;
@end

@interface MYAlertView()<UIAlertViewDelegate>
@end

@implementation MYAlertView
-(void)show {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Some title"
message:@"Some message"
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles:nil];

[alertView show]
}

#pragma mark UIAlertViewDelegate implementation

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
//Do something.
}
@end

例如,我这样使用它:

// USAGE (inside some ViewController)
-(void)showMyAlert {
dispatch_async(dispatch_get_main_queue(), ^{
MYAlertView *myAlertView = [[MYAlertView alloc] init];
[myAlertView show];
});
}

我遇到的问题如下:

  1. [myAlertView show] 使 alertView 出现。 myAlertView 被设置为 alertView 的委托(delegate)。
  2. showMyAlert 方法的 block 内只有对 myAlertView 的强引用。完成后,myAlertView 将被释放。
  3. 当用户单击 alertView 上的按钮时,alertView 调用它的委托(delegate)方法,但委托(delegate) (myAlertView) 已经被释放,因此它会导致 BAD_ACCESS(UIAlertView 中的委托(delegate)声明为 assign,而不是 weak)。

我想让 MYAlertViewUIAlertView 一样易于使用,所以我不想让用户在某处存储对它的强引用(很不方便)。

因此,只要 alertView 以某种方式显示,我就必须让 myAlertView 保持事件状态。问题是除了在 MyAlertView 中创建一个强引用,当我显示 alertView 时,我想不出任何其他方法,将它分配给 self >,并在我关闭它时将其分配给 nil

像这样(只有改变的位):

@interface MYAlertView()<UIAlertViewDelegate>
//ADDED:
@property (nonatomic, strong) id strongSelfReference;
@end

@implementation MYAlertView
-(void)show {
UIAlertView *alertView = [[UIAlertView alloc] init /*shortened*/];
[alertView show]

//ADDED:
self.strongSelfReference = self;
}

#pragma mark UIAlertViewDelegate implementation
//ADDED:
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
self.strongSelfReference = nil;
}
@end

它应该工作:当 alertView 被关闭时,strongSelfReference 将被设置为 nil,将没有强引用留下到 myAlertView,它将被释放(理论上)。

但像这样保持对 self 的强引用对我来说看起来很邪恶。有没有更好的办法?

更新:MYAlertView 实际上是围绕now deprecated 的抽象层。 UIAlertView 和一个新的 UIAlertController (iOS 8+),所以子类化 UIAlertView 不是一个选项。

最佳答案

是的,你的对象应该保持对自身的强引用。这样做并不是坏事。

自引用(或者,一般来说,任何引用循环)本质上并不是邪恶的。恶者无意中造出一个永不破损的东西,从而漏出 object 。你没有那样做。

关于ios - 强引用 `self` 使对象保持事件状态(暂时) : evil?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28418416/

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