Objective c 类方法错误,目标C

Objective c 类方法错误,目标C,objective-c,class,static,Objective C,Class,Static,我试图在Objective-C中为计算器类创建类方法(我不需要实例方法和变量),但我遇到了一些问题。我有以下.h文件: #import <Foundation/Foundation.h> @interface Calc : NSObject { NSNumber* accumulator; } //Acumulator Methods + (void) setAccumulator: (NSNumber *) value; + (void) clear; + (NSNumber *

我试图在Objective-C中为计算器类创建类方法(我不需要实例方法和变量),但我遇到了一些问题。我有以下.h文件:

#import <Foundation/Foundation.h>

@interface Calc : NSObject
{
NSNumber* accumulator;
}
//Acumulator Methods
+ (void) setAccumulator: (NSNumber *) value;
+ (void) clear;
+ (NSNumber *) accumulator;

//Arithmatic metods
+ (void) add: (NSNumber *) value;
+ (void) subtract: (NSNumber *) value;
+ (void) multiply: (NSNumber *) value;
+ (void) divide: (NSNumber *) value;

+ (void) setCurrentOperation: (NSString *) o;
+ (NSString *) currentOperation;

有人能解释一下为什么会发生这个错误,并帮我修复它吗?谢谢

正如错误所说,您不能访问类方法中的实例变量,因为实例变量属于实例,而不是类。根据定义,类方法未链接到实例,因此没有可供其更改的实例变量


一般来说,类方法应该有存在的理由。例如,用于返回特定类实例的工厂函数是类方法的一个很好的候选者,因为它与该类密切相关。否则,如果您有一个不需要访问任何实例数据的方法,那么通常最好将其作为独立函数实现。Objective-C与Java不同,在Java中,所有内容都必须填充到一个类中,无论它是否属于一个类。

如果您不需要实例变量,那么不要尝试使用它们-在这种情况下,
累加器
是您尝试使用的实例变量。如果您确实需要实例变量,请使用实例方法。

当我看到这样的代码时,我觉得您实际上是在滥用面向对象编程

您应该将这些对象看作是不同的机器。。我想在某个时候你会想要不止一个计算器。。。所以你不应该使用类方法。。。您的数据应该包含在计算器的实例中


如果你想使用类方法,你会做一些事情,比如改变所有计算器的属性,比如你可能想改变定点计算的默认精度,或者类似的事情,或者使用一种乘法算法而不是另一种。。。但一般来说,您只需要使用这些值初始化单个对象属性,而不让类方法更改已初始化的对象。。。这对于封装来说要好得多

您将
累加器
声明为实例变量,这意味着不能从类方法访问它。相反,您应该在.m文件中将其创建为静态变量。有关如何做到这一点的信息,请参见此问题:这是一个糟糕的设计选择。为什么要把所有这些方法都变成类方法?它们都应该是实例方法。我知道你说过你不想使用实例方法,但是使用实例方法/变量,然后创建一个(可能是全局的)Calc实例将是更好的方法。
+ (void) setAccumulator: (NSNumber *) value
{
      accumulator = value;
}