- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果通过惨痛的教训得知,如果委托(delegate)的生命周期比对象短,则应该从对象中删除委托(delegate)。但是,如果您不再拥有对该对象的引用,该怎么做呢?
在我的 iPhone 应用程序中,我有一个 View Controller vc
,它执行异步事件并显示为模态视图。取消按钮会关闭模态视图。如果发生错误,则会显示 UIAlertView alert
。如果用户点击“确定”,alert
和模态视图都会消失。因此vc
被设置作为 alert
的委托(delegate)并实现 alertView:didDismissWithButtonIndex:
。像这样的事情:
// UIViewController vc
...
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"Error"
message:@"Something went wrong"
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
self.alertView = alert; // needed to unset alertView.delegate in dealloc
[alert show];
[alert release];
...
}
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
[self dismissModalViewControllerAnimated:YES];
}
}
通常,警报 View 会阻止所有输入。不幸的是,在某些边缘情况下它无法做到这一点。如果用户在警报 View 出现之前触摸取消按钮,并在警报 View 出现之后触摸取消按钮,则 View 将被关闭,但警报不会被关闭。 vc
被释放,如果用户随后点击警报上的“确定”,应用程序将崩溃,因为消息已发送到已释放的对象。
我通过将 alert
分配给 vc
的属性解决了这个问题,这样我就可以在 dealloc 中将 alert.delegate
设置为 nil。我发现这个解决方案不是很优雅,因为我真的不需要警报的引用。
有更好的方法吗?
编辑:添加了斜体文本作为说明
最佳答案
尽管如此,通常会在未更改的内容上显示警报 View 。因此,如果委托(delegate)在 View 出现时处于事件状态,那么在 View 被关闭时它也可能处于事件状态。如果情况并非如此,您必须完全按照您所做的操作,如果您不再关心它的结果,则手动取消设置警报 View 的委托(delegate)。
所以你确实关心alertview,因为你关心它的委托(delegate)方法。问题是,在警报解除时,委托(delegate)可能还没有提出申请。因此,您需要那里的逻辑,并且对于该逻辑,您需要保存对相关警报 View 的引用。
换句话说,你做得对。虽然,如果 UIAlertView
保留其委托(delegate)可能会有所帮助,但如果它在关闭时崩溃,则似乎不会有帮助。
最后,我认为警报 View 阻止了所有屏幕输入?如果不是,您可以通过在警报出现时设置 vc.view.userInteractionEnabled = NO
使其成为真正的模式,并在警报消失时将其切换回来。这样,当警报 View 打开时,用户无法关闭 Controller 。这对我来说听起来更理智一些。
关于iphone - 从未引用的对象中删除 dealloc 上的委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2105958/
我看了很多文章,但我仍然不清楚我们通常创建的普通委托(delegate)和多播委托(delegate)之间的区别。 public delegate void MyMethodHandler(objec
考虑以下几点: Action a1 = new Action(_insert); Action a2 = new Action(a1); a2 指的是什么?它是 a1,a1 的浅拷贝还是 a1 的深拷
我希望这听起来像是一个显而易见的问题,但是委托(delegate)返回类型是否也必须与其委托(delegate)的方法的返回类型相匹配? EG,像这样: public static void Save
我想使用 Kotlin 委托(delegate),但我不想在委托(delegate)人之外创建委托(delegate)。委托(delegate)的所有示例都如下所示: interface Worker
class SuperClass { var delegate : SuperClassDelegate? } protocol SuperClassDelegate { func d
我有一个加载 View 的 View ,需要将 View 推送到主导航 Controller 。 我已经为每个 View 设置了一个委托(delegate),并且基本上使我的调用沿着“链”返回到主导航
为简单起见,假设我想创建一个自定义 UITextField 并向其添加一个简单的行为;也就是说,如果文本字段成为第一响应者,背景颜色将变为绿色。 为此,在我的自定义类中,我必须将该类设置为委托(del
我非常有信心我应该能够使用非静态方法的委托(delegate),但下面给了我一个错误: public class TestClass { private delegate void TestD
在 C# 中不能从 System.Delegate 或 System.MulticastDelegate 继承。只要您声明标准的“运行时托管”方法,就完全可以在 MSIL 中执行此操作。但是,每次我向
我在 Storyboard 中定义了一个 iPad 界面,带有一个 SplitViewController。我想将 SplitViewController 的委托(delegate)设置为指向详细 C
我有几个解析器。有一个顶级的可以委托(delegate)给另一个。 Parser我们从 Reader 中获取他们的输入(可变)。我只想要一个 Parser为了能够一次解析,只有一个解析器应该有 Rea
一直以来我都在阅读关于反射的文章,每个人都在说:“反射很慢”,“反射很慢”。 现在我决定测试速度有多慢,令我惊讶的是,使用反射创建的委托(delegate)实际上是使用 lambda 创建的委托(de
在 Xcode 4.5 中启动了 Cocos2D 2.1 模板(没有物理引擎),针对 iOS 6 和 iPad。在 CDAudioManager.m 文件中,以下代码... AVAudioSessio
以下是来自未管理的 dll 的函数代码。它接受一个函数指针作为参数,并简单地返回被调用函数返回的值。 extern __declspec(dllexport) int _stdcall callDe
//NewCharts.h #import @interface NewCharts : UIViewController @property(nonatomic,retain)IBOutlet U
鉴于以下 MSDN 示例代码,为什么我不能定义 Action 委托(delegate)“内联”: public static void Main(string[] args) { Action
在虚幻引擎中,UFUNCTION用于通过附加说明符来丰富功能,以用于蓝图使用、复制和委托(delegate)。 然而,一些委托(delegate)类型似乎不允许绑定(bind) UFUNCTION(如
我刚刚将照片选择器放入我的项目中,一切正常。唯一的事情是它坚持在我设置委托(delegate)的地方给我以下警告 - Assigning to 'id' from incompatible type
我有一个 UIImageView 的子类,并且想将 self 作为参数传递给委托(delegate)。我在 MyImageView 之前收到错误“预期 ')'”。我需要将对象传递给委托(delegat
我正在开发 iOS 10 的语音转文本功能。 我希望调用 SFSpeechRecognitionTaskDelegate 的委托(delegate)方法来检查完成的结果。 func speechRec
我是一名优秀的程序员,十分优秀!