title: iOS (iPhone/iPad) SDK - Using a JSON parser with Twitter's user_timeline
body: <p>Ok, here is my code:</p>
  
  <p>(appname)AppDelegate.h:</p>
  
  <pre><code>    #import &lt;UIKit/UIKit.h&gt;
  
      @class TwitterViewContoller;
  
      @interface &lt;appname&gt;AppDelegate : NSObject &lt;UIApplicationDelegate&gt; {
          UIWindow *window;
          UITabBarController *rootController;
          TwitterViewContoller *viewController;
          NSMutableData *responseData;
          NSMutableArray *tweets;
      }
  
      @property (nonatomic, retain) IBOutlet UIWindow *window;
      @property (nonatomic, retain) IBOutlet UITabBarController *rootController;
      @property (nonatomic, retain) IBOutlet TwitterViewContoller *viewController;
      @property (nonatomic, retain) NSMutableArray *tweets;
  
      @end
  </code></pre>
  
  <p>(appname)AppDelegate.m:</p>
  
  <pre><code>    #import "&lt;appname&gt;AppDelegate.h"
      #import "TwitterViewContoller.h"
      #import "SBJson.h"
  
      @implementation &lt;appname&gt;AppDelegate
  
      @synthesize window = _window;
      @synthesize rootController;
      @synthesize viewController;
      @synthesize tweets;
  
      #pragma mark -
      #pragma mark Application lifecycle
  
      - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
          // Override point for customization after application launch. 
          responseData = [[NSMutableData data] retain];
          tweets = [NSMutableArray array];
  
          NSURLRequest *request = [NSURLRequest requestWithURL:
                           [NSURL URLWithString:@"http://api.twitter.com/1/statuses/user_timeline.json?screen_name=USER_NAME_ID"]];
  
          [[NSURLConnection alloc] initWithRequest:request delegate:self];
          //[window addSubview:rootController.view];  
          //[window makeKeyAndVisible];
          return YES;
      }
  
      #pragma mark NSURLConnection delegate methods
      - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
          [responseData setLength:0];
      }
  
      - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
          [responseData appendData:data];
      }
  
      - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
      }
  
      - (void)connectionDidFinishLoading:(NSURLConnection *)connection {
          [connection release];
          NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
          [responseData release];
  
          //NSDictionary *results = [responseString JSONValue]; &lt;---This...
  
          //NSArray *allTweets = [results objectForKey:@"results"]; &lt;--- and this was original code but it caused an exception,
  
          NSArray *allTweets = [responseString JSONValue]; //&lt;-- So I used this instead.
          NSLog(@"THE ARRAY = %@", allTweets); //&lt;-- THE ARRAY IS SHOWING FINE IN THE OUTPUT LOG
          [viewController setTweets:allTweets];
          [self.window addSubview:rootController.view];
          [self.window makeKeyAndVisible];
  
      }
  
      - (void)dealloc {
          [_window release];
          [rootController release];
          [viewController release];
          [super dealloc];
      }
  
      @end
  </code></pre>
  
  <p>TwitterViewContoller.h: (yes, I know I spelt it wrong - lol)</p>
  
  <pre><code>    #import &lt;UIKit/UIKit.h&gt;
      #import "SBJson.h"
  
      @interface TwitterViewContoller : UIViewController {
          IBOutlet UILabel *label;
          NSArray *tweets;
          IBOutlet UITableView *tview;
      }
  
      @property(nonatomic, retain) IBOutlet UILabel *label;
      @property(nonatomic, retain) NSArray *tweets;
  
      @end
  </code></pre>
  
  <p>TwitterViewContoller.m:</p>
  
  <pre><code>    #import "TwitterViewContoller.h"
      #import "Tweet.h"
  
      @implementation TwitterViewContoller
  
      @synthesize label;
      @synthesize tweets;
  
      #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 20;
      }
  
      - (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...
          NSLog(@"THE ARRAY = %@", tweets); //&lt;--ARRAY IS NULL &lt;-- &lt;-- &lt;--
          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:@"screen_name"];
  
          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.
          /*
               &lt;#DetailViewController#&gt; *detailViewController = [[&lt;#DetailViewController#&gt; alloc] initWithNibName:@"&lt;#Nib name#&gt;" bundle:nil];
               // ...
               // Pass the selected object to the new view controller.
               [self.navigationController pushViewController:detailViewController animated:YES];
               [detailViewController release];
          */
      }
  
      - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
          self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
          if (self) {
              // Custom initialization
          }
          return self;
      }
  
      - (void)didReceiveMemoryWarning {
          // Releases the view if it doesn't have a superview.
          [super didReceiveMemoryWarning];
  
          // Release any cached data, images, etc that aren't in use.
      }
  
      #pragma mark - View lifecycle
  
      - (void)viewDidLoad {
          [super viewDidLoad];
          // Do any additional setup after loading the view from its nib.
          tweets = [[NSArray alloc]init];
      }
  
      - (void)viewDidUnload {
          [super viewDidUnload];
          // Release any retained subviews of the main view.
          // e.g. self.myOutlet = nil;
      }
  
      - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
          // Return YES for supported orientations
          return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
      }
  
      - (void) dealloc {
          [tweets release];
          [super dealloc];
      }
  
      @end
  </code></pre>
  
  <p>The problem is that my UITableView is showing up but none of my tweets are. I have noticed that the "tweets" array in TwitterViewContoller (I know I spelt it wrong) is empty (the null problem is fixed) but "allTweets" in my AppDelegate isn't empty. Any ideas?</p>