gpt4 book ai didi

iphone - CGFloats, float 设置为零

转载 作者:行者123 更新时间:2023-12-03 20:28:57 26 4
gpt4 key购买 nike

我有一个自定义类 Custom.mm,其中我尝试使用 Controller 类 MainController 中的 setter 设置浮点值。 Custom 实例被输入为 id,因为它是一个 Obj-C++ 文件,并且在编译时指向正确的类对我来说效果很好。一切正常,实例已验证。如果我将 amount 变量设置为 int 类型并传递 int,它就可以正常工作。与任何其他值或对象相同——除了 float 。由于某种原因,Custom.mm 类中的 float (float、CGFloat 等)被设置为 0。这不是 NSLog 或任何东西的问题——我已经用断点检查了 amount 变量,一切正常,但 float 。

    //Custom.h
@interface Custom : UIView
{

CGFloat amount;

}

@property CGFloat amount;

@end

    //Custom.mm
@implementation Custom
@synthesize amount;

- (id) initWithCoder:(NSCoder*)coder
{
if ((self = [super initWithCoder:coder]))
{
//set initial value to 1
self.amount = 1.0; //verified as 1.0
}
return self;
}

    //MainController.h
@interface MainController : UIViewController
{
IBOutlet id customInstance; //IB points to the CustomView class
}

    //MainController.m
@implementation MainController

-(void)viewDidLoad
{
[super viewDidLoad];

//Checking this value in Custom.mm via the debugger shows it as being 0,
//when before it was 1.0.
[customInstance setAmount:2.0];
}

@end

最佳答案

我能够自己重现这个;你遇到了一个有趣的现象。

您的问题是编译器无法看到 setAmount: 方法的定义。因此,它不知道该方法所期望的参数的正确类型。在这种情况下,编译器假定所有参数的类型为“...”,返回值的类型为“id”。但是您传递的是 CGFloat,而不是“...”。

Objective-C 是一种动态语言,因此即使编译器不知道目标方法是否存在,它也会愉快地打包参数并尝试调用它。 但是,在大多数架构上,传递参数的方法取决于参数的类型。整数和指针参数通常在一组寄存器中传递,而浮点参数在另一组寄存器中传递,结构通常直接在堆栈上传递。 (精确的细节取决于您运行的体系结构。)由于编译器无法看到 setAmount: 方法的定义,因此它假定参数的类型为 ... 。根据体系结构,这些可能会在不同的寄存器组中传递,甚至在堆栈上传递。

但是,当 setAmount: 方法运行时,它期望传入的参数位于特定的寄存器集中。当然,这些值没有被调用者填充,因此仍然设置为 0。调用者将新值放在一个位置,但接收者在另一个位置查找。难怪事情会出错。

解决这个问题的方法很简单:在 MainController.m 顶部添加 #import "Custom.h" 然后,编译器在编译 MainController 时将能够看到 setAmount: 的定义,从而知道将新值放在接收者期望的位置。

顺便说一句,我敢打赌,当你编译时,你会收到警告;类似的东西

warning: no '-setAmount:' method found
warning: (Messages without a matching method signature
warning: will be assumed to return 'id' and accept
warning: '...' as arguments.)

至少,这是我收到的警告。那是编译器告诉您它在进行调用时不知道将参数放在哪里,所以它只是选择了一些东西并希望它能起作用。在本例中,它没有。

对于正确工作的整数和其他类型,编译器对参数传递样式的猜测恰好与接收者的期望相匹配。这只是一个简单的运气问题。

关于iphone - CGFloats, float 设置为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5011485/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com