0

私は少し困惑しています。何らかの理由で、次のコードにより、実際の iPhone でアプリがクラッシュしますが、シミュレーターでは正常に動作しますが、json を取得してリスト ビューに表示するだけです。なぜクラッシュし続けるのですか?どんな助けでも大歓迎です!

--------SecondViewController.m------

#import "SecondViewController.h"

@interface SecondViewController ()

@end

@implementation SecondViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self fetchPrices];        
}

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

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

- (void)fetchPrices
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSData* data = [NSData dataWithContentsOfURL:
                        [NSURL URLWithString: @"http://url.php"]];

        NSError* error;

        prices = [NSJSONSerialization JSONObjectWithData:data
                                                 options:kNilOptions
                                                   error:&error];

        dispatch_async(dispatch_get_main_queue(), ^{
            [self.tableView reloadData];
        });
    });
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return prices.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"PriceCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    NSDictionary *price = [prices objectAtIndex:indexPath.row];
    NSString *text = [price objectForKey:@"name"];
    NSString *name = [price objectForKey:@"price"];

    cell.textLabel.text = text;
    cell.detailTextLabel.text = [NSString stringWithFormat:@"Price: %@", name];

    return cell;
}
@end

-----SecondViewController.h----

#import <UIKit/UIKit.h>

@interface SecondViewController : UITableViewController {
NSArray *prices;
}

- (void)fetchPrices;

@end

---- クラッシュログ ---- http://pastebin.com/cnf6L7Jf

4

1 に答える 1

1

問題は、価格を取得してから値を処理するまでの間に NSArray *prices がランダムな値になることです。第二に、あなたはそれを保持していません。したがって、価格もゴミの価値になる可能性があります。

よりクリーンな方法は、

@property(nonatomic, retain)NSArray *prices;
/**/
@synthetise prices;

// then 
SELF.prices = [[NSJSONSerialization JSONObjectWithData:data
                                                 options:kNilOptions
                                                   error:&error];

テーブルコントローラーを初期化するときは「価格」がゼロになり、必要なときにいつでも利用できるようになります。

dealloc メソッドで解放することを忘れないでください

于 2012-10-09T15:37:15.760 に答える