无法识别的选择器发送到实例...源代码链接里面

时间:2010-08-08 21:54:46

标签: iphone xcode

我对这个小应用程序感到很疯狂......请帮助我!!!

这是该应用的源代码:Smoking.zip

它只保存带有NSMutableArray的.dat文件。 现在,您第一次启动应用程序时,有时会尝试单击香烟按钮:一切都应该正常工作。 好的,现在关闭应用程序,重新打开它,再次单击按钮。这次应用程序将崩溃,“无法识别的选择器发送到实例0x5d18d60”错误。 我确定问题在于保存数据,因为当我评论“[theData writeToFile:dataFilePath atomically:YES];”时在“saveData”方法中,错误消失了。 后来我发现如果我尝试从NSMutableArray中读取数据,它会再次出现。

请花点时间检查我的项目并帮助我,因为我为此疯狂!

以下是一些代码:

#import "SmokingAppDelegate.h"
#import "SmokingViewController.h"
#import "Cig.h"

@implementation SmokingAppDelegate

@synthesize window;
@synthesize viewController, dataFilePath, smokeArray;


#pragma mark -
#pragma mark Application lifecycle

- (id) init {

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"a.dat"];

    [self setDataFilePath:path];

    NSFileManager *fileManager = [NSFileManager defaultManager];
    if([fileManager fileExistsAtPath:dataFilePath]

       ) {
        //open it and read it 
        NSLog(@"data file found. reading into memory");

        smokeArray = [[NSMutableArray alloc] init];

        NSMutableData *theData;
        NSKeyedUnarchiver *decoder;
        NSMutableArray *tempArray;

        theData = [NSData dataWithContentsOfFile:dataFilePath];
        decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:theData];
        tempArray = [decoder decodeObjectForKey:@"smokeArray"];
        [self setSmokeArray:tempArray];

        [decoder finishDecoding];
        [decoder release];      
    } else {
        NSLog(@"no file found. creating empty array");

        smokeArray = [[NSMutableArray alloc] init];
        [smokeArray insertObject:[[NSNumber alloc] initWithInt:0] atIndex:0];

    }

//  [self logArrayContents];

    return self;
}

- (void) logArrayContents {

    for(int j = 1; j < [smokeArray count]; j++) {
        int f = [[[smokeArray objectAtIndex:j] num] intValue];
        NSLog(@"%i. - %d", j, f);
    }
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Override point for customization after application launch.

    // Add the view controller's view to the window and display.
    [window addSubview:viewController.view];
    [window makeKeyAndVisible];

    return YES;
}



-(void) saveData {
    NSMutableData *theData;
    NSKeyedArchiver *encoder;

    theData = [NSMutableData data];
    encoder = [[NSKeyedArchiver alloc] initForWritingWithMutableData:theData];

    [encoder encodeObject:smokeArray forKey:@"smokeArray"];

    [encoder finishEncoding];

    [theData writeToFile:dataFilePath atomically:YES];
    [encoder release];
    NSLog(@"Saved");
}

#pragma mark -
#pragma mark Memory management


- (void)dealloc {
    [viewController release];
    [window release];
    [dataFilePath release];
    [smokeArray release];
    [super dealloc];
}


@end



#import "SmokingViewController.h"
#import "SmokingAppDelegate.h"
#import "Cig.h"

@implementation SmokingViewController
@synthesize label;

- (void)viewDidLoad {
[super viewDidLoad];

    SmokingAppDelegate *mainDelegate = (SmokingAppDelegate *)[[UIApplication sharedApplication] delegate];

//controlla se il giorno è lo stesso rispetto a quello dell'ultima sigaretta fumata
    if ([mainDelegate.smokeArray count] > 1) {


        Cig *oldCig = [mainDelegate.smokeArray lastObject];
        NSArray *tempArray = [self quando];

        if (    [[tempArray objectAtIndex:0] intValue]==[[oldCig.dat objectAtIndex:0] intValue]
            &&  [[tempArray objectAtIndex:1] intValue]==[[oldCig.dat objectAtIndex:1] intValue]
            &&  [[tempArray objectAtIndex:2] intValue]==[[oldCig.dat objectAtIndex:2] intValue]
            ) {
            N = [oldCig.num intValue];
        }
        else {
            N = 0;
        }

        [oldCig release];
        [tempArray release];

 }


//scrive quante sigarette si sono fumate oggi
    label.text = [NSString stringWithFormat: @"Today you smoked %d cigarettes",N];




}

- (IBAction) smoke:(UIButton * ) button {

    SmokingAppDelegate *mainDelegate = (SmokingAppDelegate *)[[UIApplication sharedApplication] delegate];
    NSLog(@"L'array contiene %d sigarette", [mainDelegate.smokeArray count]-1);

    N += 1;

    [self addNewCigToArray];
    [mainDelegate logArrayContents];
    [mainDelegate saveData];

    label.text = [NSString stringWithFormat: @"Today you smoked %d cigarettes",N];


}


- (void) addNewCigToArray {

    //NSLog(@"new cigarette smoked");
    SmokingAppDelegate *mainDelegate = (SmokingAppDelegate *)[[UIApplication sharedApplication] delegate];
    Cig *newCig = [[Cig alloc] init]; 

    [newCig setDat:[self quando]]; 
    [newCig setNum:[[NSNumber alloc] initWithInt:N]];

    [mainDelegate.smokeArray addObject:newCig]; 
    [newCig release];
    //[mainDelegate logArrayContents];

}

- (NSArray *) quando {

    NSDateFormatter *timeFormat = [[NSDateFormatter alloc] init];   

    // 0 - Year
    [timeFormat setDateFormat:@"YYYY"];
    NSString *year = [timeFormat stringFromDate:[NSDate date]];

    // 1 - Month
    [timeFormat setDateFormat:@"MM"];
    NSString *month = [timeFormat stringFromDate:[NSDate date]];

    // 2 - Day
    [timeFormat setDateFormat:@"dd"];
    NSString *day = [timeFormat stringFromDate:[NSDate date]];

    // 3 - Hour 
    [timeFormat setDateFormat:@"HH"];
    NSString *hour = [timeFormat stringFromDate:[NSDate date]];

    // 4 - Minute
    [timeFormat setDateFormat:@"mm"];
    NSString *min = [timeFormat stringFromDate:[NSDate date]];

    // 5 - Second
    [timeFormat setDateFormat:@"ss"];
    NSString *sec = [timeFormat stringFromDate:[NSDate date]];

    NSArray *newArray = [[NSArray alloc] initWithObjects:year,month,day,hour,min,sec,nil];

    return newArray;

}


- (void)viewDidUnload {
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}


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

@end

1 个答案:

答案 0 :(得分:0)

好的,我是一个iPhone新手,所以请大步提出我的建议。您可以尝试创建一个NSData对象,使用theData初始化它,然后在新的NSData对象而不是NSMutableData对象上调用writeToFile。