为什么编译器坚持方法 returns a "void" 而头文件声明方法 returns a float?

Why does the compiler insists a method returns a "void" when the header file claims the method returns a float?

对象的 class 接口声称其实例变量之一的访问器 returns 数据类型 "float." 但是,当我尝试编译脚本以访问这个变量,编译器抛出以下错误:"Initializing 'float' with an expression of incompatible type 'void.'" 实现代码是专有的,对我隐藏。最后一条数据是,当单步执行调试器时,调试器能够访问该方法并坚持 returned 值的类型为 "float!"

方法是否可以 return 与接口中描述的数据类型不同的数据类型?我怎样才能找出这个方法真正的 returns?关于为什么编译器、调试器和头文件似乎不一致的任何建议?

在对象的头文件中,您可以看到接口声明访问器 returns "float" :

@interface SBPulseTag : SBTag {
@private
    float start,end;
    enum PulseTypeEnum pulseType;
}
- (float)start;
- (float)end;
- (void)setStart:(float)val;
- (void)setEnd:(float)val;
@end

在我自己的代码中,我有一个通过“PulseTag”的 NSArray 进行枚举的方法,就像这样。

 -(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.'
    }

最后,XCode 调试器可以清楚地访问 [tag start] 并将其作为浮点数读取。这是 XCode:

中调试器输出的快照

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

几乎可以肯定,您未能将 SBPulseTag 的 header 文件导入此 .m 文件。

在无法看到 header 的情况下,ObjC 假定此方法 returns void(因为还有其他选择器称为 -start return void;此方法不应该被调用 start,但您无法控制它)。我怀疑你在某个地方包含了 @class SBPulseTag,所以它知道 class 存在,但不知道它的界面。

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