我是iphone开发的新手(xcode中的第3天),我在从NSMutableArray填充tableview时遇到了麻烦。我正在使用this教程作为我的指南,我的实现略有修改,因此我可以在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
答案 0 :(得分:1)
tweets = [json objectForKey:@"results"];
在这里,您将自动释放的值设置为推文ivar,并在您尝试将其用于表格视图时将其解除分配。要解决此问题,请不要为实例变量赋值,而是使用属性(它还会阻止存储在tweets
变量中的先前值泄漏):
self.tweets = [json objectForKey:@"results"];
另外考虑使用ARC(自动引用计数),它可以帮助您避免很多内存管理问题。