iPhone:在控制器中初始化对象

时间:2009-08-08 08:55:23

标签: iphone objective-c

我对objective-c很新,并且在视图控制器中初始化对象时遇到问题。我遇到的问题是,当调用setTemp方法时,屏幕上会打印“0”而不是我想要的cTemp值。任何人都可以帮我解决这个问题吗?

以下是我所拥有的代码的摘录。

SJT.h

#import <Foundation/Foundation.h>
#import <stdlib.h>
@interface SJT : NSObject {
int cTemp;
}
- (int) newTemp;
@end

SJT.m

#import "SJT.h"
@implementation SJT
- (int) newTemp
{
    cTemp =  25 + rand() % 8;
    return cTemp;
}
@end

SJTViewController.h

#import <UIKit/UIKit.h>
@class SJT;

@interface SJTViewController : UIViewController {
    IBOutlet UILabel *temp;
    SJT *sjt;
}

@property (retain, nonatomic) UILabel *temp;
@property (retain, nonatomic) SJT *sjt;

- (IBAction) setTemp: (id) sender;

@end

SJTViewController.m

#import "SJTViewController.h"
#import "SJT.h"

@implementation SJTViewController
@synthesize temp;
@synthesize sjt;



- (IBAction) setTemp: (id) sender
{
    NSString *tempText = [[NSString alloc] initWithFormat:@"%d",sjt.newTemp];
    temp.text = tempText;
    [tempText release];
}
.
.
.
@end

3 个答案:

答案 0 :(得分:2)

问题是你错误的方法调用的属性语法;即。

sjt.newTemp

将成为对[sjt newTemp]的调用。这恰好是你想要的,除了你没有在你的头/实现中指定实际上有一个名为newTemp的属性。

因此,在这种情况下,您要做的是 a)在标题中定义属性:

@property(nonatomic, readonly) int newTemp;

b),只需调用方法 newTemp

[sjt newTemp]

答案 1 :(得分:0)

您确定sjt不是nil吗?您没有提供代码SJT的构造位置和实例。在Objective-C中,您可以在nil引用上调用方法而不会出现错误,如果您对返回int的方法执行此操作,则会返回0

如果sjt.newTemp0sjt将返回nil

答案 2 :(得分:0)

Jacob和teabot都指出了有效的可能原因 - 哪一个是正确的(或两者都有!)取决于我们在您的帖子中看不到的代码片段。

根据您目前所编写的内容,您可能不会将newTemp视为属性,而更多地将其视为函数调用,因此我建议您将代码更改为:

- (IBAction) setTemp: (id) sender {
  int tempInt = [self.sjt newTemp];
  self.temp.text = [NSString stringWithFormat:@"%d", tempInt];
}

功能相同。请注意,便捷构造函数stringWithFormat:会返回一个自动释放的对象,然后由retain text的{​​{1}}属性temp保留。

仔细检查代码的另一件事是UILabel不是self.sjt,这正是teabot所说的。 Objective-C在nil指针上调用的方法调用返回0。