无法跟踪Objective-c中我的属性的值

时间:2013-04-16 12:27:21

标签: objective-c properties getter-setter

我在一个类中遇到一个属性的问题。如果它有任何区别,我正在使用iOS 6.1进行编码。

该类为UIViewController,属性在头文件中声明,如下所示:

// Keeps track of time in seconds
@property (nonatomic, strong) NSNumber *timeInSeconds;

在我的实现文件中,我使用了3次属性:

  • 一个是使用方法- (void)addTime

  • 添加时间
  • 一个是用方法- (void)subtractTime

  • 减去时间

这两种方法使用如下属性:

- (void)addTime
{
    CGFloat timeFloat = [self.timeInSeconds floatValue];

    // Here I set the value of the property timeInSeconds, but I can't access that value later on in the code!

    self.timeInSeconds = [NSNumber numberWithFloat:timeFloat +5];
    NSLog(@"Total Time:%@", self.timeInSeconds);
}

两种方法addTimesubtractTime执行他们应该做的事情,并且他们保持对timeInSeconds属性的良好跟踪,因为我添加然后减去然后添加...

问题是当我在同一个实现文件中调用第三个方法时:

- (void)updateLabelTime
{
   self.label.attributedText = [[NSAttributedString alloc]initWithString:[self.timeInSeconds stringValue]];


   [self.label setNeedsDisplay];

   [NSTimer scheduledTimerWithTimeInterval:0.8 target:self selector:@selector(updateLabelTime) userInfo:nil repeats:YES];
}

我还尝试使用NSAttributedString代替stringWithFormat创建initWithString,但问题仍然存在,而不是返回属性timeInSeconds的值,而不是之前使用addTimesubtractTime进行设置,它会调用getter创建一个timeInSeconds的新实例,因为在我的getter中我有懒惰的实例化。

我试图不为该属性编写getter / setter(因为我使用的是iOS 6.1),但没有区别。

如果我只是将标签设置为一些随机字符串,它就可以了。问题是如果我知道timeInSeconds的值为55,它仍然会创建一个新的_timeInSeconds

由于我是法国人,我用英语尽力而为,如果初学者iOS开发人员已经问过这个问题并且只是重定向我,请不要回答。我找不到答案,谢谢!

编辑:这是自定义getter

- (float)timeInSeconds
{
if (!_timeInSeconds) {
    _timeInSeconds = 0;
}

return _timeInSeconds;
}

第二次编辑:

我犯的愚蠢的初学者错误是addTime和subtractTime实际上正在实现一个协议,他们设置了“生活”在另一个类中的属性,这就是为什么我无法访问它!另一个需要协议的类是创建一个新的类实例,其中addTime和subtractTime被写入。

需要做的是将控制器设置为协议的委托。我在viewDidLoad方法中执行了以下操作:

self.view.delegate = self;

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

在头文件中,声明此属性:

@property (assign) float timeInSeconds;

在实施文件中:

@synthesize timeInSeconds = _timeInSeconds;

- (void)viewDidLoad
{
    [super viewDidLoad];
    _timeInSeconds = 0.0f;
}

- (void)addTime
{
    _timeInSeconds += 5.0f;
}

这应该将timeInSeconds初始化为零,然后每次调用addTime时将其值增加5。要在标签中使用其值:

- (void)updateLabelTime
{
   self.label.text = [NSString stringWithFormat:@"%f", _timeInSeconds];
}

答案 1 :(得分:0)

在自定义getter中,您要为对象属性指定标量值。实际上,将零赋值给对象属性相当于将对象设置为nil。

您需要做的是:

- (float)timeInSeconds
{
    if (!_timeInSeconds) {
        _timeInSeconds = [NSNumber numberWithFloat:0.0f];
        // or alternatively with the latest version of objective c
        // you can more simply use:
        // _timeInSeconds = @(0.0f);
    }

    return _timeInSeconds;
}