2010-02-17 64 views
1

在顯示滑塊的值的標籤旁邊,我想顯示與開始日期對應的日期+滑塊值單位中的天數。NSDate基本使用錯誤

當我移動滑塊時,應用程序在模擬器中崩潰。據我可以發現,當我嘗試創建一個新的NSDate字段和我的startDate對象「超出範圍」時,會發生這種情況。

閱讀了很多關於保留和發佈NSDate文檔的內容,直到現在還沒有幫助我,因爲文檔太抽象了,以至於在我看來,我無法在文檔中找到相關部分。我希望通過示例來了解更多。

那麼,下面的代碼有什麼問題(以及初學者在文檔中從哪裏學到的)?

#import <UIKit/UIKit.h> 

@interface SliderDateViewController : UIViewController { 
    UILabel *dateLabel; 
    UILabel *sliderValueLabel; 
    UISlider *slider; 
    NSDate *startDate; 

} 

@property (nonatomic, retain) IBOutlet UILabel *dateLabel; 
@property (nonatomic, retain) IBOutlet UILabel *sliderValueLabel; 
@property (nonatomic, retain) IBOutlet UISlider *slider; 
@property (nonatomic, retain) NSDate *startDate; 

-(IBAction)sliderValueChanged:(UISlider *)theSlider; 

@end 


#import "SliderDateViewController.h" 

@implementation SliderDateViewController 

@synthesize dateLabel; 
@synthesize sliderValueLabel; 
@synthesize slider; 
@synthesize startDate; 

- (void)viewDidLoad { 

    [super viewDidLoad]; 

    dateLabel.text = @"01.01.2010"; 

    sliderValueLabel.text = @"0"; 

    NSDateFormatter *inputFormatter = [[NSDateFormatter alloc] init]; 
    [inputFormatter setDateFormat:@"dd.MM.yyyy"]; 

    self.startDate = [inputFormatter dateFromString:dateLabel.text]; 

    NSLog(@"startDate: ", self.startDate.description); 

    [inputFormatter release]; 

} 

-(IBAction)sliderValueChanged:(UISlider *)theSlider { 

    int sliderValueAsInt = (int)(theSlider.value + 0.5f); 
    NSString *newText = [[NSString alloc] initWithFormat:@"%d", sliderValueAsInt]; 
    sliderValueLabel.text = newText; 
    [newText release]; 

    // Next line following the comment crashed with 
    // *** -[CFDate release]: message sent to deallocated instance 0x3b07d10 
    NSDate *newDate = [startDate addTimeInterval:86400 * sliderValueAsInt]; 

    NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init]; 
    [outputFormatter setDateFormat:@"dd.MM.yyyy"]; 

    dateLabel.text = [outputFormatter stringFromDate:newDate]; 
    [outputFormatter release]; 
    // [newDate release] // <- this was the error 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
} 

- (void)viewDidUnload { 
} 


- (void)dealloc { 
    [dateLabel release]; 
    [sliderValueLabel release]; 
    [slider release]; 
    [startDate release]; 
    [super dealloc]; 
} 

@end 

回答

2

首先,-addTimeInterval:已棄用。改爲使用-dateByAddingTimeInterval:


NSDate *newDate = [startDate addTimeInterval:86400 * sliderValueAsInt]; 
[startDate release]; 
startDate = newDate; 
[newDate release]; 

由於-addTimeInterval:不是+alloc/-copy/-create法,newDate是沒有人擁有,你不應該-release它。爲了獲得可以方便地改寫爲

self.startDate = [startDate addTimeInterval:86400 * sliderValueAsInt]; 

從代碼邏輯來看,startDate應保持不變,你需要

NSDate *newDate = [startDate addTimeInterval:86400 * sliderValueAsInt]; 
if (newDate != startDate) { 
    [startDate release]; 
    startDate = [newDate retain]; 
} 

所有權。這意味着startDate = newDate;的東西不應該出現。刪除NSDate *newDate = [startDate ...];以下的3行,代碼應該正常工作。

+0

我使用iPhone OS 3.1庫。沒有-dateByAddingTimeInterval: – 2010-02-17 17:17:24

+0

@Frank:哎呀,對不起。閱讀Mac OS X 10.6文檔集。 – kennytm 2010-02-17 17:20:21

+0

模擬器現在不會崩潰(Yippee!),但是在標籤中日期很快。當滑塊變爲零時,它們不會降低到初始值。 – 2010-02-17 17:24:18