如何让Class Objects自动显示行为

时间:2015-07-27 04:17:11

标签: objective-c cocoa-touch

我无法理解写作和调用Classes的更好点。这可能是 在Swift中更容易掌握,但是在没有开始研究的情况下让我困扰 首先在obj_c中正确使用它。目前我做的一切都在 具有iVars和Globals的ViewControllers。在应用程序中有两个应用程序18个月 存储它的过期以使它们正确。

我已经形成了一个概念,即属性是对象的状态,以及任何方法 确定对象行为,但到目前为止没有人能够告诉我。

这是一个典型的类头:

@interface Math : NSObject

@property (nonatomic, assign) int a;
@property (nonatomic, assign) int b;
@property (nonatomic, assign) int c;

-(int)mathemagic:(int)a adding:(int)b;

@end

和相应的类实现:

@implementation Math

@synthesize a = _a;
@synthesize b = _b;
@synthesize c = _c;

- (instancetype)init {
    self = [super init];
    if (self) {
       _a = 0;
       _b = 0;
       _c = 0;
    }
    return self;
}

-(int)mathemagic:(int)a adding:(int)b {
    _c = (a + b);
    return _c;
}

@end

最后在我的ViewController中的适当位置

#import "Math"

- (void)viewDidLoad {

    [super viewDidLoad];

    Math *theMath = [Math alloc]; // makes no difference if I init[]

    theMath.a = 10;
    theMath.b = 20;
    NSLog (@" answer is %i",theMath.c);
    // but still outputs to:
    // answer is 0
 }

现在我知道可以制作一个iVar,并且这样做,

int d = [self.theMath mathemagic:theMath.a adding:theMath.b];
NSLog (@" sum: %i",d);

但我不应该这样做。斯坦福CS193P似乎总是使Class成为ViewController的一个属性,但是然后所有内容再次表示为self.theMath.whatever并且数据模型不再封装在VC之外?也许斯坦福大学给Java毕业生留下了深刻的分心,直到后来。

这位读过David Flanagan的“果壳中的Java”的人, 和Niemeyer-Knudsen的“学习Java”,现在是晚了。

我不应该触摸theMath.c,只需将值赋给[theMath.a]并且[theMath.b]就足够了。

我哪里错了?

2 个答案:

答案 0 :(得分:0)

我认为那是因为你在alloc init中设置a和b = 0。你没有在任何地方打电话[self mathemagic:a adding:b]

我认为我应该将-(instancetype)init更改为

    - (instancetype)initWith:(int)a andb:(int)b {
self = [super init];
if (self) {
    _c = [self mathemagic:a adding:b];
}
return self;

}

并在viewDidLoad中使用

     Math *theMath = [[Math alloc]initWith:10 andb:20];

希望这会有所帮助:)

答案 1 :(得分:0)

我认为你对Objective-C类的工作方式存在误解。

首先,在Objective-C中创建一个对象需要两个步骤。你必须两个:

  • 为新对象动态分配内存
  • 将新分配的内存初始化为适当的值

因此,您的Math实例初始化应如下所示:

Math *theMath = [[Math alloc] init];

只需调用alloc即可清除对象的所有实例变量。虽然在您的情况下使用[Math alloc][[Math alloc] init]没有区别,但这不是很好的编程风格。

其次,如果通过"自动显示行为"您的意思是记录mathemagic:adding:方法的结果,然后您应该将其作为参数传递给NSLog函数而不是theMath.c

NSLog(@" should show the sum being %i", [theMath mathemagic:theMath.a adding:theMath.b]);