私は限界を押し広げている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として機能しますか?
ありがとう!