Почему некоторые члены объекта выходят за рамки цели C - PullRequest
1 голос
/ 04 декабря 2010

Я прихожу в Objective-C из фона Java. У меня проблемы с пониманием того, почему следующий код генерирует исключение.

    
@interface Stopwatch : NSObject {
    NSDate *start;
    int    mode;
}
@property(nonatomic,assign) NSDate *start;
@property(nonatomic,assign) int mode;
@end

@implementation Stopwatch
@synthesize start, mode;
-(id) init{
    self = [super init];
    if(self){
        start = [NSDate date];
        mode = -1;
    }
    return self;
}
@end


@interface StopwatchController : NSObject {
    Stopwatch *stopwatch;
}
@property (nonatomic,assign) Stopwatch *stopwatch;

- (void) useStopwatch:(Stopwatch*)aStopwatch;
- (void) updateStopwatch;
@end

@implementation StopwatchController
@synthesize stopwatch;

- (void) useStopwatch:(Stopwatch*)aStopwatch{
    stopwatch = aStopwatch;
}

- (void) updateStopwatch{
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc]init];
    [dateFormat setTimeStyle:NSDateFormatterMediumStyle];
    [dateFormat setDateStyle:NSDateFormatterMediumStyle];
    NSString *string = [dateFormat stringFromDate:stopwatch.start];
    NSLog(@"%@",string);
}
@end

Итак, когда запускается следующий код, я вижу, что файл stopwatch.start находится вне области видимости, но не секундомер?


Stopwatch *sw = [[Stopwatch alloc]init];
StopwatchControlelr *swc = [[StopwatchController alloc]init];
[swc useStopwatch:sw];
[swc updateStopwatch];

Ответы [ 2 ]

5 голосов
/ 04 декабря 2010

В вашем init

start = [NSDate date];

Не используется свойство start - используется переменная экземпляра start.Это означает, что удержание никогда не вызывалось.[NSDate date] возвращает объект, который будет автоматически выпущен.

Мой совет - использовать

self.start = [NSDate date];

Это свойство используется.В вашем случае я бы также объявил это свойство retain, а не assign.Если вы сохраните его assign, вам нужно позвонить сохранить.Так что с assign, также сделайте это

[self.start retain];

Один из способов убедиться, что вы все делаете правильно, - объявить поля, подобные этому

NSDate * _start;

Свойства, подобные этому

@property (retain, nonatomic) NSDate * start;

и затем sythesize следующим образом

@synthesize start = _start.

Затем вы узнаете, когда используете переменную экземпляра (которая обходит любые вызовы набора, автоматическое сохранение и т. Д.) Или свойство.

Если бы вы сделали это, то это не скомпилировало бы

   start = [NSDate date];

Вам нужно будет либо перейти на этот

   self.start = [NSDate date]; // use property

, либо на этот

   _start = [NSDate date]; // use instance variable
1 голос
/ 04 декабря 2010

[NSDate date] дает вам автоматически выпущенный экземпляр, который будет освобожден при сливе соответствующего пула автоматического выпуска. Вы должны сохранить его, чтобы стать владельцем, см. Документацию по Управление памятью какао .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...