为什么我的数组返回null?

时间:2013-10-04 11:08:21

标签: ios objective-c cocoa-touch nsmutablearray nsarray

我在这里打电话给getBoardingCards:

BRPBoardingCards *boardingCards = [[BRPBoardingCards alloc] init];
boardingCardsArray = [boardingCards getBoardingCards];

虽然数组返回null(在NSLog中显示)。我做错了什么?

- (NSArray*)getBoardingCards
{
    NSMutableArray *storedArray = [[NSMutableArray alloc] init];
    Utils *utils = [[Utils alloc] init];
    NSUserDefaults *properties = [utils getUserDefaults];



    // check if its the first time we are running the app.
    if(![[properties objectForKey:@"first_run"] isEqualToString:@"no"]){
        //I decided it is for american tourists and every booking office allows payment in dollars because I dont have a euros key on my keyboard.
        //Car also has lots of seats. 1337 of them to be precise.
        [self setNewBoardingCardWithCardType:@"car" WithPrice:@"$1.50" AndStartLocation:@"airport" AndEndLocation:@"restaurant" WithSeat:@"1337" andExtraInformation:@"We dont like you so we are giving you the back seat by yourself."];
        [self setNewBoardingCardWithCardType:@"helicopter" WithPrice:@"$500" AndStartLocation:@"restaurant" AndEndLocation:@"hospital" WithSeat:@"1" andExtraInformation:@"You are driving."];
        [self setNewBoardingCardWithCardType:@"train" WithPrice:@"$100" AndStartLocation:@"restaurant" AndEndLocation:@"ditch" WithSeat:@"STANDONHEAD" andExtraInformation:@"No Seats on this train. Gotta stand on your head. Dont forget your white lightning for the ditch."];
        [self setNewBoardingCardWithCardType:@"Fire Engine" WithPrice:@"$10" AndStartLocation:@"restaurant" AndEndLocation:@"burning house" WithSeat:@"HOSE" andExtraInformation:@"Take the hose to put out this fire we are heading to. "];
        [self setNewBoardingCardWithCardType:@"Nimbus" WithPrice:@"$300" AndStartLocation:@"burning house" AndEndLocation:@"popo floating island" WithSeat:@"LEVITATION" andExtraInformation:@"Dont forget to turn super saiyan on your way up there. "];
        [self setNewBoardingCardWithCardType:@"Sky Dive" WithPrice:@"$1020" AndStartLocation:@"popo floating island" AndEndLocation:@"home" WithSeat:@"GRAVITY" andExtraInformation:@"Ohh! that Adrenalines pumping. "];

        [self setNewBoardingCardWithCardType:@"Legs" WithPrice:@"$50" AndStartLocation:@"ditch" AndEndLocation:@"park bench hotel" WithSeat:@"VODKA" andExtraInformation:@"Time to get a good nights rest and sobre up. "];
        [self setNewBoardingCardWithCardType:@"Bicycle" WithPrice:@"$5" AndStartLocation:@"park bench hotel" AndEndLocation:@"home" WithSeat:@"BIKESEAT1" andExtraInformation:@"What a terrible hangover. Time to head home. "];

        [self setNewBoardingCardWithCardType:@"ambulance" WithPrice:@"$40" AndStartLocation:@"hospital" AndEndLocation:@"home" WithSeat:@"LEVITATION" andExtraInformation:@"Well that was a bad idea! "];

        [properties setObject:@"no" forKey:@"first_run"];
        [properties synchronize];

        NSLog(@"did set first run to no");
    }

        storedArray = [[properties objectForKey:@"cards"] mutableCopy];


        NSLog(@"getBoardingCards storedArray: %@", storedArray);

    return storedArray;
}

- (NSArray*)getBoardingCardsByType:(NSString*)cardType
{
    // at this point i would create a for loop and iterate through the array checking if (type isEqualToString:cardType).
    // But this is just an idea for later. To go by only a certain type of route. 
    return nil;
}



- (void)setNewBoardingCardWithCardType:(NSString*)cardType WithPrice:(NSString*)price AndStartLocation:(NSString*)startLocation  AndEndLocation:(NSString*)endLocation WithSeat:(NSString*)seatCode andExtraInformation:(NSString*)extraInfo{

    // populate the dictionary with data.
    NSMutableDictionary *card = [[NSMutableDictionary alloc] init];
    [card setObject:cardType forKey:@"type"];
    [card setObject:price forKey:@"price"];
    [card setObject:startLocation forKey:@"startLocation"];
    [card setObject:endLocation forKey:@"endLocation"];
    [card setObject:seatCode forKey:@"seat"];
    [card setObject:extraInfo forKey:@"info"];

    // get our stored array.
    Utils *utils = [[Utils alloc] init];
    NSUserDefaults *properties = [utils getUserDefaults];
    NSMutableArray *storedArray = [[properties objectForKey:@"cards"] mutableCopy];

    [storedArray addObject:card];
    // set the stored array.
    [properties setObject:storedArray forKey:@"cards"];
    [properties synchronize];

}

1 个答案:

答案 0 :(得分:4)

您没有在cards中创建NSUserDefaults可变数组。 这一行(setNewBoardingCardWithCardType:):

NSMutableArray *storedArray = [[properties objectForKey:@"cards"] mutableCopy];

基本上是

NSMutableArray *storedArray = [nil mutableCopy];

相同
NSMutableArray *storedArray = nil;

检查此密钥的对象是否存在 - 如果不存在 - 创建它然后再使用它。