基于块的UIAlertView与ARC

时间:2012-10-14 22:12:48

标签: ios categories

我正在阅读推动限制的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吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

1)使用ARC时,您无法进行任何释放或自动释放的调用,因此不需要调用释放。 ARC将在您分配副本时为您处理。

2)我也没见过。我只是用'自我'。

3)类别不能有ivars。在这里使用静态是危险的,只有在100%肯定的情况下才能使用,在当前显示警报视图时,您永远不会调用此 showAlertViewWithTitle:... 类方法。

就个人而言,由于需要静态,我不会将此作为UIAlertView的类别方法。我创建了一个扩展UIAlertView的常规类(MyAlertView或类似的),并添加了一个带有两个块参数的新“show”方法。然后你的自定义类可以为块提供适当的ivars。