cocoa 块中的 typedef

typedef in cocoa blocks

我对简单的Blocks和typedef有疑问。 考虑以下代码,我有一些 typedef 和两个方法,第二个被注释掉了。我的疑问是关于第一个。我应该使用这个吗?未来可能出现的任何问题或事情?

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;

    ....
}

你应该使用这个:

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

请注意 MySuccessBlockMyFailureBlock 开头的大写字母,与您的 typedef 相同。

事实上,当你声明时:

- (void)myServiceWithCompletion:mySuccessBlock
                          failure:myFailureBlock;

问题是因为您没有指定参数 'mySuccessBlock' 和 'myFailureBlock' 的类型。所以它们被视为默认类型 id 因为:

If a return or parameter type isn’t explicitly declared, it’s assumed to be the default type for methods and messages—an id.

这就像你写:

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

idtype是指针,block是指针,所以不存在编译问题。但是由于黑色的参数和 return 值,您可能会遇到执行问题!

typedef 声明提供了一种创建别名的方法,可以在任何地方使用它来代替(可能很复杂的)类型名称。 See

您应该按以下方式使用typedef。

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