1

私はiphone開発(xcodeで3日目)の初心者であり、NSMutableArrayからテーブルビューを設定するのに問題があります。このチュートリアルをガイドとして使用していますが、pageControl内にテーブルを表示できるように、実装が少し変更されています。配列にデータが入力されていることは確かですが、配列に入力された後はテーブルに表示されません。データの再読み込み方法を使用しようとしましたが、アプリがクラッシュします。どんな助けでも大歓迎です。

マイコード

ヘッダ

#import <UIKit/UIKit.h>

@interface TwitterView : UIViewController <UITableViewDelegate>{

NSMutableArray *tweets;  
UITableView *twitterTable;    

} 

@property (nonatomic, retain) NSMutableArray *tweets;  
@property (nonatomic, retain) IBOutlet UITableView *twitterTable;
@end

実装

#import "TwitterView.h"
#import "Tweet.h"


//JSON 
@interface NSDictionary(JSONCategories)
+(NSDictionary*)dictionaryWithContentsOfJSONURLString:(NSString*)urlAddress;
-(NSData*)toJSON;
@end

@implementation NSDictionary(JSONCategories)
+(NSDictionary*)dictionaryWithContentsOfJSONURLString:(NSString*)urlAddress
{
    NSData* data = [NSData dataWithContentsOfURL: [NSURL URLWithString: urlAddress] ];
__autoreleasing NSError* error = nil;
id result = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions     error:&error];
if (error != nil) return nil;
return result;
}

-(NSData*)toJSON
{
NSError* error = nil;
id result = [NSJSONSerialization dataWithJSONObject:self options:kNilOptions error:&error];
if (error != nil) return nil;
return result;    
}
@end

@implementation TwitterView

@synthesize tweets;
@synthesize twitterTable;

#pragma mark -
#pragma mark View lifecycle


- (void)viewDidLoad {
  [super viewDidLoad];

tweets = [[NSMutableArray alloc]init];
//JSON CODE
dispatch_async(kBgQueue, ^{
    NSData* data = [NSData dataWithContentsOfURL: twitterURL];
    [self performSelectorOnMainThread:@selector(fetchedData:) withObject:data waitUntilDone:YES];
});

}

#pragma mark -
#pragma mark Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
// Return the number of sections.
return 1;
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
return [tweets count];
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 80;
}


// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

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

  // Configure the cell...

NSDictionary *aTweet = [tweets objectAtIndex:[indexPath row]];

    cell.textLabel.text = [aTweet objectForKey:@"text"];
cell.textLabel.adjustsFontSizeToFitWidth = YES;
cell.textLabel.font = [UIFont systemFontOfSize:12];
cell.textLabel.minimumFontSize = 10;
cell.textLabel.numberOfLines = 4;
cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;

cell.detailTextLabel.text = [aTweet objectForKey:@"from_user"];

NSURL *url = [NSURL URLWithString:[aTweet objectForKey:@"profile_image_url"]];
NSData *data = [NSData dataWithContentsOfURL:url];
cell.imageView.image = [UIImage imageWithData:data];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;
 }

#pragma mark -
#pragma mark Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
 // Navigation logic may go here. Create and push another view controller.
/*
 <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc]   initWithNibName:@"<#Nib name#>" bundle:nil];
 // ...
 // Pass the selected object to the new view controller.
 [self.navigationController pushViewController:detailViewController animated:YES];
 [detailViewController release];
 */
}


#pragma mark -
#pragma mark Memory management

- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];

// Relinquish ownership any cached data, images, etc that aren't in use.
}

- (void)dealloc {
[tweets release];
[twitterTable release];
[super dealloc];
}


//JSON CODE
- (void)fetchedData:(NSData *)responseData {
//parse out the json data
NSError* error;
NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseData //1
                                                     options:kNilOptions 
                                                       error:&error];


tweets = [json objectForKey:@"results"];
NSLog(@"The Tweets %@", tweets);    

//[twitterTable reloadData];<--Cause app to crash


}

@end
4

1 に答える 1

1
tweets = [json objectForKey:@"results"];

ここでは、autoreleased値をツイートivarに設定すると、テーブルビューに使用しようとするまでに割り当てが解除されます。この問題を修正するには、インスタンス変数に値を割り当てないでください。代わりにプロパティを使用してください(これにより、tweets変数に格納されている以前の値がリークするのを防ぐこともできます)。

self.tweets = [json objectForKey:@"results"];

また、ARC(自動参照カウント)の使用を検討してください。これは、多くのメモリ管理の問題を回避するのに役立ちます。

于 2013-03-06T15:19:18.310 に答える