title: When to use properties in objective C?
body: <p>I have a question here:  <a href="https://stackoverflow.com/questions/8191714/confusing-double-free-error-message-memory-leak-in-iphone-app">Confusing double free error message/memory leak in iPhone app</a> which I think needs a new question to answer it.</p>
  
  <p>The code I am interested in is in that question but I will re post it here</p>
  
  <pre><code>#import &lt;UIKit/UIKit.h&gt;
  #import "MyManager.h"
  
  @interface ListOfCarShares : UITableViewController &lt;NSXMLParserDelegate&gt;
  {
      NSURLConnection *connection;
      NSMutableData *carsharexml;
      NSMutableArray *ldestination;
      NSMutableArray *ldeparts_from;
      NSMutableArray *lcs_id;
      NSMutableArray *ltime;
      NSMutableString *currentElement;
  
      NSMutableString *tdest;
      NSMutableString *tfrom;
      NSMutableString *ttime;
      NSMutableString *tid;
  }
  
  -(void)fetchcarshares;
  @property (nonatomic, assign) IBOutlet UITableViewCell *maincell;
  
  @end
  
  #import "ListOfCarShares.h"
  
  @implementation ListOfCarShares
  @synthesize maincell;
  
  - (id)initWithStyle:(UITableViewStyle)style
  {
      self = [super initWithStyle:style];
      if (self) {
          // Custom initialization
      }
      return self;
  }
  
  - (void)parser:(NSXMLParser *)parser
  didStartElement:(NSString *)elementName
    namespaceURI:(NSString *)namespaceURI
   qualifiedName:(NSString *)qualifiedName
      attributes:(NSDictionary *)attributeDict
  {
      currentElement = [[elementName copy] autorelease];
      if ([elementName isEqualToString:@"destination"]) 
      {
  
          //NSLog(@"found current conditions tag it reads %@",currentElement);
          tdest = [[NSMutableString alloc] init];
      }
      if ([elementName isEqualToString:@"departs_from"])
      {
          tfrom = [[NSMutableString alloc] init]; 
      }
      if ([elementName isEqualToString:@"time"])
      {
          ttime = [[NSMutableString alloc] init]; 
      }
      if ([elementName isEqualToString:@"cs_id"])
      {
          tid = [[NSMutableString alloc] init]; 
      }
  }
  - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
  {
      if ([currentElement isEqualToString:@"destination"])
      {
          [tdest appendString:string];
      }
      if ([currentElement isEqualToString:@"departs_from"])
      {
          [tfrom appendString:string];
      }
      if ([currentElement isEqualToString:@"time"])
      {
          [ttime appendString:string];
      }
      if ([currentElement isEqualToString:@"cs_id"])
      {
          [tid appendString:string];
      }
  }
  - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
  {
      if ([currentElement isEqualToString:@"destination"])
      {
          [ldestination addObject:tdest];
          [tdest release];
      }
      if ([currentElement isEqualToString:@"departs_from"])
      {
          [ldeparts_from addObject:tfrom];
          [tfrom release];
      }
      if ([currentElement isEqualToString:@"time"])
      {
          [ltime addObject:ttime];
          [ttime release];
      }
      if ([currentElement isEqualToString:@"cs_id"])
      {
          [lcs_id addObject:tid];
          [tid release];
      }
  }
  - (void)didReceiveMemoryWarning
  {
      [super didReceiveMemoryWarning];
  }
  #pragma mark - View lifecycle
  - (void)viewDidLoad
  {
      [super viewDidLoad];
      // Uncomment the following line to preserve selection between presentations.
      // self.clearsSelectionOnViewWillAppear = NO;
      // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
      // self.navigationItem.rightBarButtonItem = self.editButtonItem;
  }
  
  - (void)viewDidUnload
  {
      [super viewDidUnload];
  }
  - (void)viewWillAppear:(BOOL)animated
  {
      [super viewWillAppear:animated];
      ldestination = [[NSMutableArray alloc] init];
      ldeparts_from = [[NSMutableArray alloc] init];
      ltime = [[NSMutableArray alloc] init];
      lcs_id = [[NSMutableArray alloc] init];
      carsharexml = [[NSMutableData alloc] init];
  
      [self fetchcarshares];
  }
  
  - (void)viewDidAppear:(BOOL)animated
  {
      [super viewDidAppear:animated];
  }
  
  - (void)viewWillDisappear:(BOOL)animated
  {
      [super viewWillDisappear:animated];
  
      [connection release];
  
      [ldestination release];
      [ldeparts_from release];
      [ltime release];
      [lcs_id release]; ///
      [carsharexml release];
  }
  
  - (void)viewDidDisappear:(BOOL)animated
  {
      [super viewDidDisappear:animated];
  }
  
  - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
  {
      // Return YES for supported orientations
      return (interfaceOrientation == UIInterfaceOrientationPortrait);
  }
  
  #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 [ltime count];
  }
  
  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  {
      //static NSString *CellIdentifier = @"Cell";
  
      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nil];
      if (cell == nil) 
      {
          [[NSBundle mainBundle] loadNibNamed:@"carsharecell" owner:self options:nil];
      }
  
      // Configure the cell...
      cell=maincell;
  
      UILabel *from;
      UILabel *dest;
      UILabel *time;
  
      from = (UILabel *)[cell viewWithTag:4];
      dest = (UILabel *)[cell viewWithTag:5];
      time = (UILabel *)[cell viewWithTag:6];
      from.text=[ldeparts_from objectAtIndex:indexPath.row];
      dest.text=[ldestination objectAtIndex:indexPath.row];
      time.text=[ltime objectAtIndex:indexPath.row];
      return cell;
  }
  
  /*
  // Override to support conditional editing of the table view.
  - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
  {
      // Return NO if you do not want the specified item to be editable.
      return YES;
  }
  */
  
  /*
  // Override to support editing the table view.
  - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
  {
      if (editingStyle == UITableViewCellEditingStyleDelete) {
          // Delete the row from the data source
          [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
      }   
      else if (editingStyle == UITableViewCellEditingStyleInsert) {
          // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
      }   
  }
  */
  
  /*
  // Override to support rearranging the table view.
  - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
  {
  }
  */
  
  /*
  // Override to support conditional rearranging of the table view.
  - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
  {
      // Return NO if you do not want the item to be re-orderable.
      return YES;
  }
  */
  
  -(void)fetchcarshares
  {
  
      MyManager *sharedManager = [MyManager sharedManager];
      NSString *urlString = [NSString stringWithFormat:@"http://url/get.php?username=%@&amp;password=%@",sharedManager.user,sharedManager.passw];
  
      NSURL *url = [NSURL URLWithString:urlString];
      NSURLRequest *req = [NSURLRequest requestWithURL:url];
  
      connection = [[NSURLConnection alloc] initWithRequest:req delegate:self startImmediately:YES];
  
  }
  
  -(void) connection:(NSURLConnection *)conn didReceiveData:(NSData *)data
  {
      [carsharexml appendData:data];
  }
  
  -(void) connectionDidFinishLoading:(NSURLConnection *)conn
  {
      NSString *xmlcheck = [[NSString alloc] initWithData:carsharexml encoding:NSUTF8StringEncoding];
  
      NSLog(@"%@",xmlcheck);
  
      [xmlcheck release];
      NSXMLParser *parser = [[NSXMLParser alloc] initWithData: carsharexml];
      [parser setDelegate:self];
      [parser parse];
      [parser release];
  
      [[self tableView] reloadData];
  }
  
  -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
  {
      return 102;
  }
  #pragma mark - Table view delegate
  
  - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
  {
  }
  
  -(void)dealloc
  {
      [super dealloc]; 
  }
  
  @end
  </code></pre>
  
  <p>I only have one property defined in the .h file. The people who answered that question seem to think that the reason I am having double free error is due to the fact I don't have <code>@property</code> for my variables.</p>
  
  <p>I have lots of code practically identical to this and I don't have a problem. </p>
  
  <p>My questions are </p>
  
  <ol>
  <li>When should I use a property?</li>
  <li>Should I be using properties here and why?</li>
  </ol>
  
  <p>Thanks</p>