我正在阅读推动限制的iOS 5,作者有一个基于块的警报视图的示例。这是代码:
·H
typedef void (^DismissBlock)(int buttonIndex);
typedef void (^CancelBlock)();
+ (UIAlertView *)showAlertViewWithTitle:(NSString *)title
message:(NSString *)message
cancelButtonTitle:(NSString *)cancelButtonTitle
otherButtonTitles:(NSArray *)otherButtons
onDismiss:(DismissBlock)dismissed
onCancel:(CancelBlock)cancelled;
的.m
static DismissBlock _dismissBlock;
static CancelBlock _cancelBlock;
+ (UIAlertView *)showAlertViewWithTitle:(NSString *)title
message:(NSString *)message
cancelButtonTitle:(NSString *)cancelButtonTitle
otherButtonTitles:(NSArray *)otherButtons
onDismiss:(DismissBlock)dismissed
onCancel:(CancelBlock)cancelled {
[_cancelBlock release];
_cancelBlock = [cancelled copy];
[_dismissBlock release];
_dismissBlock = [dismissed copy];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:message delegate:[self self] cancelButtonTitle:cancelButtonTitle otherButtonTitles: nil];
for (NSString *buttonTitle in otherButtons) {
[alert addButtonWithTitle:buttonTitle];
}
[alert show];
return [alert autorelease];
}
+ (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
if (buttonIndex == [alertView cancelButtonIndex]) {
_cancelBlock();
}
else {
_dismissBlock(buttonIndex - 1); // cancel button is index 0
}
[_cancelBlock autorelease];
[_dismissBlock autorelease];
}
我对这个实现有几个问题。
1)如果我正在使用ARC,在showAlertViewWithTitle方法中,在复制之前是否需要释放该块?为什么或为什么不呢?
2)在showAlertViewWithTitle:方法中,他指定了委托:[self self]。这实际上是如何工作的?我以前没见过这种表示法。
3)为什么为dismiss和cancel块声明了静态变量?这基本上是这个类别的ivar吗?
谢谢!
答案 0 :(得分:2)
1)使用ARC时,您无法进行任何释放或自动释放的调用,因此不需要调用释放。 ARC将在您分配副本时为您处理。
2)我也没见过。我只是用'自我'。
3)类别不能有ivars。在这里使用静态是危险的,只有在100%肯定的情况下才能使用,在当前显示警报视图时,您永远不会调用此 showAlertViewWithTitle:... 类方法。
就个人而言,由于需要静态,我不会将此作为UIAlertView的类别方法。我创建了一个扩展UIAlertView的常规类(MyAlertView或类似的),并添加了一个带有两个块参数的新“show”方法。然后你的自定义类可以为块提供适当的ivars。