我对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
答案 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.newTemp
为0
,sjt
将返回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。