我已经查看了一些关于如何为 UIAlertView 提供上下文的想法。常见的答案是将其保存在字典或 UIAlertView 的子类中。我不喜欢将上下文保存在字典中的想法,这是数据的错误位置。Apple 不支持子类化 UIAlertView,因此按照我的标准,这不是一个好的解决方案。
我想出了一个主意,但我不知道该怎么做。创建一个上下文对象的实例,它是 UIAlertView 的委托。反过来,警报视图上下文有它自己的委托,即视图控制器。
问题是释放内存。我将 alertView.delegate 设置为 nil 并调用 [self autorelease] 以释放 -alertView:didDismissWithButtonIndex: 中的上下文对象。
问题是:我给自己造成了什么问题?我怀疑我正在为一个微妙的记忆错误做好准备。
这是仅支持 -alertView:clickedButtonAtIndex 的简单版本:
采用
- (void)askUserIfTheyWantToSeeRemoteNotification:(NSDictionary *)userInfo
{
[[[[UIAlertView alloc] initWithTitle:[userInfo valueForKey:@"action"]
message:[userInfo valueForKeyPath:@"aps.alert"]
delegate:[[WantAlertViewContext alloc] initWithDelegate:self context:userInfo]
cancelButtonTitle:@"Dismiss"
otherButtonTitles:@"View", nil] autorelease] show];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex withContext:(id)context
{
if (buttonIndex != alertView.cancelButtonIndex)
[self presentViewForRemoteNotification:context];
}
界面
@protocol WantAlertViewContextDelegate <NSObject>
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex withContext:(id)context;
@end
@interface WantAlertViewContext : NSObject <UIAlertViewDelegate>
- (id)initWithDelegate:(id<WantAlertViewContextDelegate>)delegate context:(id)context;
@property (assign, nonatomic) id<WantAlertViewContextDelegate> delegate;
@property (retain, nonatomic) id context;
@end
执行
@implementation WantAlertViewContext
- (id)initWithDelegate:(id<WantAlertViewContextDelegate>)delegate context:(id)context
{
self = [super init];
if (self) {
_delegate = delegate;
_context = [context retain];
}
return self;
}
- (void)dealloc
{
[_context release];
[super dealloc];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
[self.delegate alertView:alertView clickedButtonAtIndex:buttonIndex withContext:self.context];
}
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
alertView.delegate = nil;
[self autorelease];
}
@synthesize delegate = _delegate;
@synthesize context = _context;
@end