2015-05-04 40 views
0

我有一個簡單的Blocks和typedef疑問。 考慮下面的代碼,我有一些typedef和兩個方法,第二個被註釋掉。我懷疑是關於第一個。我應該使用這個嗎?任何問題或未來可能出現的問題?typedef in cocoa blocks

typedef void (^MySuccessBlock)(MyServiceResponse *response); 
typedef void (^MyFailureBlock)(NSError *errorObject); 

@property (nonatomic, copy)MySuccessBlock mySuccessBlock; 
@property (nonatomic, copy)MyFailureBlock myFailureBlock; 

//SHOULD I USE THIS? 
- (void)myServiceWithCompletion:mySuccessBlock 
          failure:myFailureBlock; 

//- (void)myServiceWithCompletion:(void (^)(MyServiceResponse *response))completion 
//      failure:(void (^)(NSError *errorObject))failure; 

在實現文件:

//If 1st one is used: 
- (void)myServiceWithCompletion:aSuccessBlock 
          failure:aFailureBlock{ 

    self.mySuccessBlock = aSuccessBlock; 
    self.myFailureBlock = aFailureBlock; 

    .... 
} 
+0

你如何傳遞的財產,以這樣的 – Sandeep

+0

@Anoop它完全沒有使用此方法的定義,我們在很多地方,我們沒有遇到任何問題,都用這個。 – GoodSp33d

+0

它看起來可以使用,它只是用戶定義的命名約定。它在內部只會在真正的塊定義中進行轉換。 – Mrunal

回答

3

你應該使用這樣的:

- (void)myServiceWithCompletion:(MySuccessBlock)successBlock 
          failure:(MyFailureBlock)failureBlock; 

注意在MySuccessBlockMyFailureBlock開始首都在你的typedef。

事實上,當你聲明:

- (void)myServiceWithCompletion:mySuccessBlock 
          failure:myFailureBlock; 

的問題來自於事實,你沒有指定你的參數「mySuccessBlock」和「myFailureBlock」的類型。因此,他們被視爲默認類型id因爲:

如果退貨或參數類型不明確聲明,它認爲 成爲方法和消息,一個id的默認類型。

是,如果你寫這樣的:

- (void)myServiceWithCompletion:(id)mySuccessBlock 
          failure:(id)myFailureBlock; 

id類型是一個指針,而塊的指針,所以沒有編譯問題。但是由於黑色的參數和返回值,你可能會遇到執行問題!

+0

沒有注意到錯字(或者可能不是,那也是爲什麼OP可能會遇到一些問題)。儘管這是正確的用法。它應該是'.h'和'.m'文件中的相同方法聲明。您始終可以擴展typedef。 – GoodSp33d

+0

我在「我的」中使用了「m」,它仍然編譯並運行,沒有警告,沒有錯誤。它有什麼區別嗎? –

0

typedef聲明提供了一種方法來創建一個別名,可以在任何地方用來代替(可能是複雜)類型的名稱。 See

您應該按照以下方式使用typedef。

- (void)myServiceWithCompletion:(MySuccessBlock)aSuccessBlock 
         failure:(MyFailureBlock)aFailureBlock;