Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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
Objective c 可可粉中的指针帮助_Objective C_Cocoa_Pointers_Macos - Fatal编程技术网

Objective c 可可粉中的指针帮助

Objective c 可可粉中的指针帮助,objective-c,cocoa,pointers,macos,Objective C,Cocoa,Pointers,Macos,我正在尝试用cocoa制作一个简单的计算器应用程序。当我点击其中一个按钮时,程序挂起。我想我已经将问题追溯到了控制器的一部分,该部分在当前显示的数字末尾添加了一个数字: - (void)updateNumber:(int)buttonClicked{ *self.activeNumberPointer = *self.activeNumberPointer * 10 + buttonClicked; [outputField setFloatValue:*self.activeNumberP

我正在尝试用cocoa制作一个简单的计算器应用程序。当我点击其中一个按钮时,程序挂起。我想我已经将问题追溯到了控制器的一部分,该部分在当前显示的数字末尾添加了一个数字:

- (void)updateNumber:(int)buttonClicked{
 *self.activeNumberPointer = *self.activeNumberPointer * 10 + buttonClicked;
 [outputField setFloatValue:*self.activeNumberPointer];
}
我使用了一个指向activeNumber的指针,以便让我的程序知道我正在编辑的两个操作数中的哪一个

谢谢你的帮助

编辑:我的声明和@property:

//CalculatorController.h
@interface CalculatorController : NSObject {
    IBOutlet NSTextField *outputField;
    float variable1, variable2;
    float *variable1Pointer, *variable2Pointer;
    float *activeNumberPointer;
}

float variable1 = 0;
float variable2 = 0;
float* variable1Pointer = &variable1;
float* variable2Pointer = &variable2;
float* activeNumberPointer = &variable1;

@property (readwrite) float variable1, variable2;
@property (readwrite) float *vairable1Pointer, *variable2Pointer;
@property (readwrite) float *activeNumberPointer;

...
此处提供完整的XCode文件: 仅供参考:我实际上在项目中使用了leftNumberValue和rightNumberValue,而不是variable1和variable2
因为我是Objective-C和XCode的新手,所以欢迎任何一般性的批评。

在使用self.activeNumberInter或activeNumberInter时,您不需要在定义它们时将*放在self.activeNumberInter或activeNumberInter前面。尝试:

- (void)updateNumber:(int)buttonClicked{
 self.activeNumberPointer = self.activeNumberPointer * 10 + buttonClicked;
 [outputField setFloatValue:activeNumberPointer];
}

不清楚objective-C中使用简单变量类型的指针,也不完全清楚为什么要使用指针

*self.activeNumberPointer = *self.activeNumberPointer * 10 + buttonClicked;
您在此表达式左侧使用的*运算符取消引用错误。在做作业时,你不想这样取消引用

这是C++引用,但指针逻辑的一个好的开始。< /P> 我可能会使用NSMutableArray或类似的构造,您希望存储两个以上的数字,对吗?并使用整数索引指向屏幕上显示的当前数字

此外,我不知道这是否是一个打字错误,或一些丢失的代码等,但

@interface CalculatorController : NSObject {
    IBOutlet NSTextField *outputField;
    float variable1, variable2;
    float *variable1Pointer, *variable2Pointer;
    float *activeNumberPointer;
}

float variable1 = 0;
float variable2 = 0;
float* variable1Pointer = &variable1;
float* variable2Pointer = &variable2;
float* activeNumberPointer = &variable1;
。。。您似乎将接口定义中的上述所有变量声明为IVAR或直接连接到CalculatorController的实例变量,然后在接口定义之外,将这些变量重新声明为全局变量。第二组定义不需要在实现中使用它们

如果您希望初始化这些实例变量,通常有一个名为-init的函数,您可以重写它,因为您是NSObject的子类,它类似于其他语言中的构造函数。这将存在于您的实现文件.m或.mm中。它可能看起来像这样:

-(CalculatorController *)init{
   if( self = [super init] ){
       // Do your initialization here etc
   }
   return self;
}
还有另一个函数——awakeFromNib,如果它作为用户界面定义的一部分在XIB/NIB文件中实例化,则可以重写它。加载类和UI时会调用-awakeFromNib函数

编辑:明确指针业务。。。。 self.activeNumberPointer=*self.activeNumberPointer*10+点击按钮

这是对的。在查找self.activenumberinter的值时,您不会在左侧使用取消引用操作符,但会在右侧使用取消引用操作符

乔希

不能在类@接口内初始化实例变量。实际上,您在这里所做的是用每个名称声明两个变量

对于每个名称,一个变量是实例变量,在紧跟@interface之后的{…}中声明,另一个是全局变量,在标头的其他位置声明。具体地说,您在@interface中声明了全局变量,但这并不重要:全局变量与任何类或对象都没有关系,您可以将它们放在@interface中或不放在@interface中,而编译器对此没有异议

您初始化了全局指针变量以指向全局浮点变量,但在@implementation中的方法体中,实例变量的级别高于全局变量实例变量的范围更窄。此外,属性总是基于实例变量,而不是全局变量。因此,在方法中,您通过属性引用实例变量,而不是初始化的全局变量

实例变量在实例创建时初始化为nil,因此ActiveNumberInter实例变量的值为NULL。因此,像这样的陈述:

*self.activeNumberPointer = *self.activeNumberPointer * 10 + buttonClicked;
读取和写入空指针。这就是你看到的车祸

还值得指出的是:

*self.activeNumberPointer = …
不是属性赋值,也就是说,它不向self发送setActiveNumberInter:消息;它是发送getter消息的属性检索,该消息返回指针。为了避免混淆这两者,有必要削减财产

崩溃的解决方案是删除全局变量并在代码中初始化实例变量。这就是init方法的用途。在中重写init并在那里设置初始指针值。直接访问这些实例变量,而无需在整个类中遍历属性

更好的是,完全不用指针的杂耍。使用BOOL变量在它们之间进行选择:

BOOL editingVariable2;
在需要使用活动变量时测试布尔值。为了避免每次需要时都编写麻烦的if-else语句,您可以将其封装到一个方法中, 命名为SetValueOfActivVariable:switchActive:,它执行第一部分所述的操作,然后,如果第二部分的参数为“是”,则切换活动变量


布尔变量解决方案将完全消除从此类访问未初始化或不再有效的浮点指针的风险。

Yes,但是我不需要在指针之前添加*以获得它所指向的值吗?为什么ActiveNumberInter是指针?它应该指向用户编辑并显示在ouputField上的变量1。当用户单击“加”、“减”、“乘”或“除”时,它会将ActiveNumberInter更改为指向variable2。单击等号时,它会对variable1和variable2执行必要的操作。我希望这能澄清我的问题。如果您添加声明和@property声明,我们会更容易。还有,variable1和variable2在哪里,它们是ivar吗?程序挂起是什么意思?这是撞车吗?是否有任何错误输出到控制台?没有有用的控制台输出。程序启动正常,但当我单击10个数字按钮之一时挂起。它只是以gdb结尾,然后在点击的*self.activeNumberPointer=*self.activeNumberPointer*10+按钮旁边放一个红色箭头;在XCode中
BOOL editingVariable2;