Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么NULL需要使用块进行类型转换?_Ios_Objective C_Xcode_Uiimage_Objective C Blocks - Fatal编程技术网

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是的,我正在考虑这样做。。。无论如何,谢谢你。