2012-10-14 48 views
1

我正在閱讀iOS 5推動限制,作者有一個基於塊的警報視圖的示例。下面的代碼:基於塊的UIAlertView與ARC

.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塊聲明靜態變量?這基本上是作爲這個類別的伊娃嗎?

謝謝!

+1

爲什麼'_dismissBlock(buttonIndex - 1);'爲什麼不'_dismissBlock(buttonIndex);'? – anonim

回答

2

1)使用ARC時,不能進行任何釋放或自動釋放調用,因此不需要調用釋放。當您分配副本時,ARC會爲您負責。

2)我從來沒有見過這種。我只是用'自我'。

3)分類不能有ivars。這裏使用靜態是危險的,只有當你100%肯定地表示你永遠不會調用這個showAlertViewWithTitle:...類方法,而當前顯示一個alert視圖。

就個人而言,由於需要靜態,我不會將此類別方法設置爲UIAlertView。我會創建一個擴展UIAlertView的常規類(MyAlertView或類似的),並添加一個新的'show'方法,它接受兩個塊參數。然後你的自定義類可以有適當的ivars的塊。