2010-12-04 6 views
1

JavaのバックグラウンドからObjective-Cに来ています。なぜ次のコードが例外を生成するのか理解できない。なぜObjective Cの対象外のオブジェクトメンバーですか?

 
@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]; 

答えて

5

start = [NSDate date]; 

は、開始プロパティを使用しません - それは、開始インスタンス変数を使用しています。これは、保持が決して呼び出されなかったことを意味します。 [NSDate date]は、自動解放するオブジェクトを返します。

私のアドバイスは、このプロパティを使用しています

self.start = [NSDate date]; 

を使用することです。あなたの場合は、assignではなく、このプロパティーをretainと宣言します。それをassignのままにする場合は、retainを呼び出す必要があります。だから、assignで、また、あなたはそれが正しいこの

@property (retain, nonatomic) NSDate * start; 

のようなこの

NSDate * _start; 

プロパティのようにフィールドを宣言することです確認するために、この

[self.start retain]; 

一つの方法を行い、その後、同じようsythesizeこの

@synthesize start = _start. 

次に、インスタンス変数(set呼び出し、自動保持など)またはプロパティをバイパスするときを知っています。

あなたは、これは

start = [NSDate date]; 

をコンパイルしないだろう、ということでした場合は、この

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

またはこの

_start = [NSDate date]; // use instance variable 
に変更する必要があると思いますいずれか
1

[NSDate date]はあなたに関連した自動解放プールが排出されたときに割り当て解除されます自動解放インスタンスを提供します。所有権を取得するには、それを保持する必要があります。Cocoa Memory Managementのドキュメントを参照してください。あなたのinitで

関連する問題