Ios 为什么NULL需要使用块进行类型转换?
请参见此场景:Ios 为什么NULL需要使用块进行类型转换?,ios,objective-c,xcode,uiimage,objective-c-blocks,Ios,Objective C,Xcode,Uiimage,Objective C Blocks,请参见此场景: @property (nonatomic,copy) UIImage * (^bgImageBlock)(void); bgImageBlock块变量的定义: objDrawing.bgImageBlock = ^(){ return (UIImage *)NULL; }; bgImageBlock具有返回类型UIImage,如果我像这样传递NULL: objDrawing.bgImageBlock = ^(){ return NU
@property (nonatomic,copy) UIImage * (^bgImageBlock)(void);
bgImageBlock
块变量的定义:
objDrawing.bgImageBlock = ^(){
return (UIImage *)NULL;
};
bgImageBlock具有返回类型UIImage,如果我像这样传递NULL:
objDrawing.bgImageBlock = ^(){
return NULL;
};
将给出编译时错误:分配给UIImage的不可压缩块指针类型。
然而,若我使用简单的UIImage变量并将其赋值为NULL,那个么它绝对是好的。那么为什么在块的情况下,没有类型转换它不能接受NULL呢 您的块需要类型
UIImage*
。但是,NULL
作为指针,它无法识别它是否指向类型为UIImage*
的任何位置(不管是什么)。砰,错误
但是,您现在正在投射指针。它在运行时实际上不做任何事情。它只是修改所指向的类型,然后影响对结果值的后续操作。但实际指针值在整个转换过程中将保持不变
虽然实际指针保持不变(尽管指向的值为零),但它现在指向的是块预期返回的类型。一切都很好 如果没有明确说明,编译器将根据返回的对象类型推断块返回类型。因此,在这种情况下:
objDrawing.bgImageBlock = ^(){
return NULL;
};
…我假设它看到了NULL
,并推断出块的返回类型是void*
,即NULL
的类型。这与您的属性类型不匹配,因此编译器会抱怨。(请注意,错误与“块指针类型”有关;这是块属性声明与试图存储在其中的块之间的不匹配。)
如果显式地告诉它您的类型,您应该能够使用简单的NULL返回:
objDrawing.bgImageBlock = ^UIImage*(){
return NULL;
};
记录了从返回类型推断出的块类型:
返回类型是可选的,可以从返回语句中推断出来。如果return语句返回一个值,则它们都必须返回相同类型的值。如果没有返回值,则推断出的块类型为void;否则,它是返回语句值的类型
“Objective-C的进展”中提到了这种对返回类型的推断,以及编译器为您检查指针类型并在不匹配时产生错误的事实。(参见标题为“返回类型推断”的部分)。
NULL
类型为void*
,因此该块被推断为具有返回类型void*
,而非目标C对象指针类型(如void*
)与目标C对象指针类型(如UIImage*
)不兼容。相反,您应该使用nil
,它也是一个空指针,但类型为id
,与所有Objective-C-object指针类型兼容。因此,如果没有声明返回类型,它默认为void。这意味着简单地返回代码>应该可以,对吗?否则,如果您将返回声明为id
,则可以不使用returnnil代码>哪一个更为传统的Objective-C,但仍然允许正确返回对象?您应该向Apple提交错误报告。使用“不可编辑”一词的错误消息是不可接受的。@gnasher729是的,我正在考虑这样做。。。无论如何,谢谢你。