NSDate崩溃我的应用程序,我不明白为什么

时间:2012-08-14 04:16:59

标签: uitableview ios5 crash nsdate uidatepicker

基础知识如下:

我需要使用1个UIDatePicker控制2次(NSDate)。我在XCode(v 4.4.1)中创建了一个新的Single View项目,只是为了开始摆弄我需要的项目。我在创建项目时使用了故事板,轻松自如。在故事板中,我摆脱了视图控制器并拖出了导航控制器。删除了作为根视图控制器的表视图,并添加了一个常规视图控制器作为根视图控制器。在那里我放了一个按钮。我拖出另一个视图控制器,并使用“推送”将根视图控制器上的该按钮连接到这个新的视图控制器。非常简单。我测试它,它工作,基本。

我为刚添加的新视图控制器创建了一个类,并将故事板中的视图控制器设置为该类型。在故事板中,我然后添加了一个UIDatePicker,一个UIButton和一个UITableView(请记住,这只是我在努力让事情变得有效并试图学习如何使用所有东西,对此仍然很新)。

我的ViewController类的代码如下:

NewViewController.h

#import <UIKit/UIKit.h>

@interface Reminders : UIViewController <UITableViewDataSource, UITableViewDelegate> {
NSInteger selectedRow;
}

@property (nonatomic, retain) NSDate *amTime;
@property (nonatomic, retain) NSDate *pmTime;

@property (nonatomic, retain) IBOutlet UITableView      *tbl;
@property (nonatomic, retain) IBOutlet UIDatePicker *picker;

- (IBAction)timeChange:(id)sender;
- (IBAction)pickerChange:(id)sender;

- (NSString *)dateAsString: (NSDate *)date;

@end

NewViewController.m

#import "Reminders.h"

@interface Reminders ()

@end

@implementation Reminders

@synthesize tbl, picker;
@synthesize amTime, pmTime;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
    // Custom initialization
    NSLog(@"init");

}
return self;
}

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
NSLog(@"did load");

amTime = [NSDate date];
NSLog(@"AM time viewDidLoad: %@", [self dateAsString:amTime]);

pmTime = [NSDate date];
NSLog(@"PM time viewDidLoad: %@", [self dateAsString:pmTime]);

selectedRow = (NSInteger)1;
}

- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}





-(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}


-(NSInteger) tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section
{
return 3;
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
//NSLog(@"cell for row");
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"MyIdentifier"];
}

if (indexPath.row == 0) {
    cell.textLabel.text = @"Dose";
    cell.detailTextLabel.text = @"120";
}
else if (indexPath.row == 1) {
    cell.textLabel.text = @"AM";
    //cell.detailTextLabel.text = @"time am";

    cell.detailTextLabel.text = [self dateAsString:amTime];

}
else if (indexPath.row == 2) {
    cell.textLabel.text = @"PM";
    //cell.detailTextLabel.text = @"time pm";

    cell.detailTextLabel.text = [self dateAsString:pmTime];
}

if (selectedRow == indexPath.row) {
    [tbl selectRowAtIndexPath:[NSIndexPath indexPathForRow:indexPath.row inSection:0] animated:NO scrollPosition:0];
}

return cell;
}


-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row == 0) {
    selectedRow = 0;
}
else if (indexPath.row == 1) {
    selectedRow = 1;
    [picker setDate:amTime];
}
else if (indexPath.row == 2) {
    selectedRow = 2;
    [picker setDate:pmTime];
}
}


- (IBAction)timeChange:(id)sender {
if (selectedRow == 1) {
    amTime = [NSDate date];
    NSLog(@"time change: %@", [self dateAsString:amTime]);
}
else if (selectedRow == 2) {
    pmTime = [NSDate date];
    NSLog(@"time change: %@", [self dateAsString:pmTime]);
}
else {

}

[tbl reloadData];
}

- (IBAction)pickerChange:(id)sender {
if (selectedRow == 1) {
    amTime = [picker date];
    NSLog(@"PICKER time change: %@", [self dateAsString:amTime]);
}
else if (selectedRow == 2) {
    pmTime = [picker date];
    NSLog(@"PICKER time change: %@", [self dateAsString:pmTime]);
}
else {
    NSLog(@"picker does NOTHING");
}

[tbl reloadData];
}

- (NSString *)dateAsString:(NSDate *)date {
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

NSString *stringFromDate = [formatter stringFromDate:date];

return stringFromDate;

}

是的,我完全意识到按钮和日期选择器都有改变时间的动作以及按钮和相应动作的原因,因为当我无法使其工作时我开始添加内容方式我认为应该一直在工作。

反正。时间似乎开始很好,但有些观点是通过检查我看到的无效的客观c对象。当它尝试将'amTime'放入单元格详细信息文本时,它会阻塞cellForRowAtIndexPath方法。

这是踢球者....我创建了相同的应用程序,使用上面提到的相同步骤,相同的代码(复制粘贴),在另一台机器上(具有正确的代码签名密钥),并且该版本正常工作,即使我在当前的机器上运行该项目。当我在当前机器上创建项目时,它会崩溃。

我为篇幅很道歉,但我想尝试尽可能多地提供详细信息。

2 个答案:

答案 0 :(得分:0)

似乎你的变量太快被解除分配了。我会在实例变量中保存amTimepmTime,并通过self.amTimeself.pmTime在我的代码中访问它们:因为它们是属性,所以getter / setters方法将保留/释放适当。

有关raywenderlich.com的精彩三部分教程,解释了iOS开发中内存管理的基础知识:必读。

http://www.raywenderlich.com/2657/memory-management-in-objective-c-tutorial

答案 1 :(得分:0)

ARD在没有太多努力的情况下完成了这个伎俩,但是如果没有ARC,则需要在amTime和pmTime变量上保留一些内容。