Objective c 为什么编译器坚持一个方法返回一个";“无效”;当头文件声明该方法返回浮点值时?

Objective c 为什么编译器坚持一个方法返回一个";“无效”;当头文件声明该方法返回浮点值时?,objective-c,interface,accessor,custom-data-type,Objective C,Interface,Accessor,Custom Data Type,对象的类接口声明其实例变量之一的访问器返回“float”类型的数据。但是,当我试图编译脚本以访问此变量时,编译器抛出以下错误:“使用不兼容类型“void”的表达式初始化“float”。”实现代码是专有的,对我来说是隐藏的。最后一段数据是,当单步执行调试器时,调试器能够访问该方法,并坚持返回值的类型为“float!” 方法是否可能返回与接口中描述的不同的数据类型?我怎样才能知道这个方法真正返回的是什么?关于为什么编译器、调试器和头文件看起来不一致,有什么建议吗 在对象的头文件中,您可以看到接口声明

对象的类接口声明其实例变量之一的访问器返回“float”类型的数据。但是,当我试图编译脚本以访问此变量时,编译器抛出以下错误:“使用不兼容类型“void”的表达式初始化“float”。”实现代码是专有的,对我来说是隐藏的。最后一段数据是,当单步执行调试器时,调试器能够访问该方法,并坚持返回值的类型为“float!”

方法是否可能返回与接口中描述的不同的数据类型?我怎样才能知道这个方法真正返回的是什么?关于为什么编译器、调试器和头文件看起来不一致,有什么建议吗

在对象的头文件中,您可以看到接口声明访问器返回“float”:

在我自己的代码中,我有一个方法,它通过一个NSArray'PulseTag's枚举,如下所示

 -(WaveformSegment *) WaveformSegmentTest:(int)myInput {

// <... Some overlying code...>

SBPulseTag *tag;  // Declare an object to receive each object in the array

while(tag = [enumerator nextObject]) {  // Loop through the array
    int tmp = [tag start];  // Initializing 'float' with an expression of incompatible type 'void.'
    }
-(波形片段*)波形片段测试:(int)myInput{
// 
SBPulseTag*tag;//声明一个对象以接收数组中的每个对象
while(tag=[enumerator nextObject]){//循环遍历数组
int tmp=[tag start];//使用不兼容类型“void”的表达式初始化“float”
}
最后,XCode调试器可以清楚地访问[tag start],并将其作为浮点读取。以下是XCode中调试器输出的快照:


有什么想法吗?我很困惑。

您几乎肯定无法将
SBPulseTag
的头文件导入此
.m
文件

在看不到标题的情况下,ObjC假设此方法返回
void
(因为还有其他名为
-start
的选择器返回
void
;此方法不应被称为
start
,但您无法控制该方法)。我怀疑您在某个地方包含了
@class SBPulseTag
,因此它知道该类存在,但不知道其接口


确保检查是否有任何其他警告。编译器可能会警告您其他冲突。

Ah。这实际上是有道理的!是的,没错,其中一个包含的头文件包含您建议的@class语句。我一直在想Xcode如何能够自动填充其他类的一些方法。现在我确定了现在!
 -(WaveformSegment *) WaveformSegmentTest:(int)myInput {

// <... Some overlying code...>

SBPulseTag *tag;  // Declare an object to receive each object in the array

while(tag = [enumerator nextObject]) {  // Loop through the array
    int tmp = [tag start];  // Initializing 'float' with an expression of incompatible type 'void.'
    }