Ios 返回不带typedef的块的Objective-C方法的语法/签名是什么?
我定义了一个块,它接受一个Ios 返回不带typedef的块的Objective-C方法的语法/签名是什么?,ios,objective-c,block,objective-c-blocks,Ios,Objective C,Block,Objective C Blocks,我定义了一个块,它接受一个NSString,并为该字符串返回一个NSURL: id (^)(id obj) 我使用了typedef将其设置为一个带有名称的块: typedef id (^URLTransformer)(id); 以下方法不起作用: + (URLTransformer)transformerToUrlWithString:(NSString *)urlStr { return Block_copy(^(id obj){ if ([obj isKindOf
NSString
,并为该字符串返回一个NSURL
:
id (^)(id obj)
我使用了typedef
将其设置为一个带有名称的块:
typedef id (^URLTransformer)(id);
以下方法不起作用:
+ (URLTransformer)transformerToUrlWithString:(NSString *)urlStr
{
return Block_copy(^(id obj){
if ([obj isKindOfClass:NSString.class])
{
NSString *urlStr = obj;
return [NSURL URLWithString:[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
}
return nil; // **THIS LINE FAILS**
});
}
错误:
阻止时,返回类型“void*”必须与以前的返回类型“id”匹配
文本具有未指定的显式返回类型
我的问题是:
1.如何正确实施该方法
2.如何在没有typedef URLTransformer的情况下实现该方法
谢谢
您可以将其强制转换为id
或将类型添加到块中。我之前问过,并引用了
删除该错误的正确方法是为
块文字:
就你而言
+ (URLTransformer)transformerToUrlWithString:(NSString *)urlStr
{
return Block_copy(^id(id obj){ // id here
if ([obj isKindOfClass:NSString.class])
{
NSString *urlStr = obj;
return [NSURL URLWithString:[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
}
return nil; // id here
});
}
或
二,
要返回不带typedef的块,可以使用类似的语法返回函数指针
+ (id (^)(id))transformerToUrlWithString:(NSString *)urlStr;
您可以从中查看更多示例
注:在ObjC代码中,您应该避免使用块复制
,使用[Block copy]
PS2:您必须使用ARC(否则会有很多泄漏),并且您不需要显式复制块(在99%的情况下,包括这一个)
PS3:您应该尽可能避免使用
id
,因此您的块应该是typedef NSURL*(^urltransfer)(NSString*)代码>您可以避免这样的typedef
:
@interface Blah : NSObject
+(id (^)(id)) blockret;
@end
@implementation Blah
+(id (^)(id)) blockret {
return ^(id obj) {
return @"helo";
};
}
@end
你的块的类型是id(^)(id)
-这是加号后面的括号。嗨,它说'Cast of block pointer type'id(^)(u strong id)'到C pointer type'const void*'需要桥接转换,如果我不使用block\u copy,它可以与[…copy]一起工作。@hzxu你的Xcode/Clang版本是什么?您还可以强制转换nil
。e、 g.return(id)nil代码>您的代码如何处理方法的urlStr
参数?
+ (id (^)(id))transformerToUrlWithString:(NSString *)urlStr;
@interface Blah : NSObject
+(id (^)(id)) blockret;
@end
@implementation Blah
+(id (^)(id)) blockret {
return ^(id obj) {
return @"helo";
};
}
@end