1

私は限界を押し広げているiOS5を読んでおり、作者はブロックベースのアラートビューの例を持っています。コードは次のとおりです。

.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:メソッドで、彼はデリゲート:[selfself]を割り当てます。これは実際にどのように機能しますか?私はこれまでこの表記を見たことがありません。

3)dismissブロックとcancelブロックに対して静的変数が宣言されているのはなぜですか?これは基本的にこのカテゴリのivarとして機能しますか?

ありがとう!

4

1 に答える 1

2

1)ARCを使用している場合、releaseまたはautoreleaseを呼び出すことはできないため、releaseを呼び出す必要はありません。コピーを割り当てるときに、ARCがそれを処理します。

2)私もそれを見たことがありません。私は「自己」を使用します。

3)カテゴリにivarを含めることはできません。ここでの統計の使用は危険であり、アラートビューが現在表示されている間は、このshowAlertViewWithTitle:...クラスメソッドを呼び出さないことが100%肯定的である場合にのみ機能します。

個人的には、統計が必要なため、これをUIAlertViewのカテゴリメソッドにはしません。UIAlertViewを拡張し、2つのブロックパラメーターを受け取る新しい「show」メソッドを追加する通常のクラス(MyAlertViewなど)を作成します。次に、カスタムクラスにブロックの適切なivarを含めることができます。

于 2012-10-14T22:26:05.050 に答える