title: Class with memory leaks in instruments
body: <p>I have a couple of classes which functions are execute SQL statements against a WEB service in order to get or set data in the database.</p>
  
  <p>Works fine, but the problem is when I'm testing in instruments/leaks the 90% of the leaks are because these classes.</p>
  
  <p>Could you tell me what I'm loosing?</p>
  
  <p>Thanks.</p>
  
  <p>Here is the code:</p>
  
  <p>Where the data is stored:</p>
  
  <p>.h</p>
  
  <pre><code>@interface iSQLResult : NSObject {
      NSMutableArray *Records;
  }
  @property (nonatomic, assign) int CountX;
  @property (nonatomic, assign) int CountY;
  @property (nonatomic, retain) NSMutableArray *Columns;
  @property (nonatomic, retain) NSMutableArray *Records;
  @property (nonatomic, retain) NSMutableArray *FieldsNames;
  @property (nonatomic, assign) int ErrorCode;
  @property (nonatomic, retain) NSString *ErrorDescription;
  
  
  -(void)addField:(NSString*)fieldName;
  -(void)addRecord:(NSMutableArray*)items;
  -(NSMutableArray *)getRecord:(int)y;
  -(NSString*)getValue:(int) x posY:(int) y;
  -(NSString*)getValueByName:(NSString *) colName posY:(int) y;
  -(void)setValueByName:(NSString *) colName posY:(int) y value:(NSString *)value;
  -(id) copyWithZone: (NSZone *) zone;
  @end
  </code></pre>
  
  <p>.m</p>
  
  <pre><code>#import "iSQLResult.h"
  #import &lt;stdarg.h&gt;
  
  @implementation iSQLResult
  @synthesize CountX;
  @synthesize CountY;
  @synthesize Columns;
  @synthesize Records;
  @synthesize FieldsNames;
  @synthesize ErrorCode;
  @synthesize ErrorDescription;
  
  -(id)init
  {
      self = [super init];
  
      if (self)
      {
          self.CountX =0;
          self.CountY =0;
          self.ErrorCode = 0;
          self.ErrorDescription = @"";
  
          self.FieldsNames = [NSMutableArray array];
          self.Columns = [NSMutableArray array];
          self.Records = [NSMutableArray array];
  
      }
  
      return self;
  }
  -(void)removeRecord:(int)index
  {
      [self.Records removeObjectAtIndex:index];
      self.CountY = self.CountY - 1;
  }
  -(void)addField:(NSString*)fieldName
  {
      [self.FieldsNames addObject:[NSString stringWithFormat:@"%@", fieldName]];
      self.CountX = self.CountX +1;
  }
  -(void)addRecord:(NSMutableArray*)items
  {
      [self.Records addObject:items];
      self.CountY = self.CountY +1;
  }
  -(NSMutableArray *)getRecord:(int)y
  {
      return [Records objectAtIndex:y];
  }
  -(NSString *)getValue:(int) x posY:(int)y
  {
      return [[NSString stringWithFormat:@"%@", [[Records objectAtIndex:y] objectAtIndex:x]] copy];
  }
  -(NSString*)getValueByName:(NSString *) colName posY:(int) y
  {
      int a=0;
      for (a=0;a&lt;CountX;a++)
      {
          if ([[colName uppercaseString] isEqualToString:[[FieldsNames objectAtIndex:a] uppercaseString]])
          {
              return [[NSString stringWithFormat:@"%@", [[Records objectAtIndex:y] objectAtIndex:a]] copy];
          }
      }
      return @"";
  }
  -(void)setValueByName:(NSString *) colName posY:(int) y value:(NSString *)value
  {
      int a=0;
      for (a=0;a&lt;CountX;a++)
      {
          if ([[colName uppercaseString] isEqualToString:[[FieldsNames objectAtIndex:a] uppercaseString]])
          {
              [[Records objectAtIndex:y] replaceObjectAtIndex:a withObject:value];
          }
      }
  
  }
  -(void)dealloc
  {
      [Columns release];
      [Records release];
      [FieldsNames release];
      [ErrorDescription release];
  
      [super dealloc];
  }
  -(id) copyWithZone: (NSZone *) zone
  {
      iSQLResult *SQLRCopy = [[iSQLResult allocWithZone: zone] init];
  
      [SQLRCopy setCountX:self.CountX];
      [SQLRCopy setCountY:self.CountY];
      [SQLRCopy setRecords:[self.Records mutableCopyWithZone:zone]];
      [SQLRCopy setColumns:[self.Columns mutableCopyWithZone:zone]];
      [SQLRCopy setFieldsNames:[self.FieldsNames mutableCopyWithZone:zone]];
      [SQLRCopy setErrorCode:self.ErrorCode];
      [SQLRCopy setErrorDescription:[self.ErrorDescription copyWithZone:zone]];
  
      return SQLRCopy;
  }
  @end
  </code></pre>
  
  <p>The class who ask for the data to the web service comunication class and gets a xml structure:</p>
  
  <p>.h</p>
  
  <pre><code>#import &lt;Foundation/Foundation.h&gt;
  #import "iSQLResult.h"
  #import "IM2_WebServiceComm.h"
  
  @interface iSQL : NSObject &lt;NSXMLParserDelegate&gt; {
  
      iSQLResult *SQLR;
      IM2_WebServiceComm * WSC;
  
      NSXMLParser *xmlParser;
      BOOL Found;
      BOOL FieldsReaded;
      BOOL loadFieldsNow;
      BOOL loadErrNumNow;
      BOOL loadErrDesNow;
      NSString *chunksString;
      NSMutableArray *tempRecord;
  }
  @property (nonatomic, retain) NSString *URLConnection;
  -(void)SQLReader:(NSString*)SQLString;
  -(void)SQLExec:(NSString*)SQLString;
  -(void)setURLConnection:(NSString *) WebSURL;
  -(iSQLResult*) getSQLR;
  -(void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName;
  -(void) parser:(NSXMLParser *) parser foundCharacters:(NSString *)string;
  -(void) parser:(NSXMLParser *) parser didStartElement:(NSString *) elementName namespaceURI:(NSString *) namespaceURI qualifiedName:(NSString *) qName attributes:(NSDictionary *) attributeDict;
  @end
  </code></pre>
  
  <p>.m</p>
  
  <pre><code>#import "iSQL.h"
  @implementation iSQL
  @synthesize URLConnection;
  - (iSQLResult*)getSQLR
  {
      return [SQLR copy];
  }
  -(void)SQLExec:(NSString*)SQLString
  {
  
      FieldsReaded = NO;
      Found = NO;
      loadFieldsNow = NO;
  
      if (SQLR)
      {
          [SQLR release];
          SQLR = nil;
      }
  
  
  SQLR = [[iSQLResult alloc] init];
  
  WSC = [[IM2_WebServiceComm alloc] init];
  [WSC setURL:URLConnection];
  
  NSString *theXML = [WSC callMethod:@"ExecNonQuery" sendInstruction:SQLString];
  
  @try
  {
      xmlParser = [[NSXMLParser alloc] initWithData:[theXML dataUsingEncoding:NSUTF8StringEncoding]];
      [xmlParser setDelegate: self];
      [xmlParser setShouldResolveExternalEntities:NO];
      if(![xmlParser parse])
      {
          NSLog(@"ERROR PARSING");
      }
      [xmlParser release];
  }
  @catch(NSException * ex) 
  {
      NSLog(@"%@",[[ex reason] UTF8String]);
  }
  [WSC release];
  }
  -(void)SQLReader:(NSString*)SQLString
  {
  
  FieldsReaded = NO;
  Found = NO;
  loadFieldsNow = NO;
  
  if (SQLR)
  {
      [SQLR release];
      SQLR = nil;
  }
  
  SQLR = [[iSQLResult alloc] init];
  
  WSC = [[IM2_WebServiceComm alloc] init];
  [WSC setURL:URLConnection];
  
  NSString *theXML = [WSC callMethod:@"ExecSQL" sendInstruction:SQLString];
  
  @try
  {
      xmlParser = [[NSXMLParser alloc] initWithData:[theXML dataUsingEncoding:NSUTF8StringEncoding]];
      [xmlParser setDelegate: self];
      [xmlParser setShouldResolveExternalEntities:NO];
      if(![xmlParser parse])
      {
          NSLog(@"ERROR PARSING");
      }
      [xmlParser release];
  }
  @catch(NSException * ex) 
  {
      NSLog([NSString stringWithFormat:@"%@",[[ex reason] UTF8String]]);
  }
  [WSC release];
  }
  
  -(iSQLResult *)getSingleSQLR:(iSQLResult *)SQLSource usingRow:(int)y
  {
  
  iSQLResult *SQLRAux = [[[iSQLResult alloc]init]retain];
  
  [SQLRAux setCountX:SQLSource.CountX];
  [SQLRAux addRecord:[SQLSource getRecord:y]];
  [SQLRAux setFieldsNames:SQLSource.FieldsNames];
  
  return SQLRAux;
  
  }
  
  -(void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{
      NSLog(@"Error on XML Parse: %@", [parseError localizedDescription] );
  }
  
  //#pragma XML Parser Delegate Methods
  -(void) parser:(NSXMLParser *) parser didStartElement:(NSString *) elementName namespaceURI:(NSString *) namespaceURI qualifiedName:(NSString *) qName attributes:(NSDictionary *) attributeDict 
  {
      if (!chunksString)
  {
      chunksString = [[NSString alloc] init];
  }
  chunksString = @"";
  if ([elementName isEqualToString:@"ErrCode"])
  {
      loadErrNumNow = YES;
  }
  if ([elementName isEqualToString:@"ErrDesc"])
  {
      loadErrDesNow = YES;
  }
  
  if ([elementName isEqualToString:@"Table"])
  {
      Found = YES;
      loadFieldsNow = NO;
      tempRecord = [[NSMutableArray alloc] init];
  }
  
  if (Found &amp;&amp; ![elementName isEqualToString:@"Table"]) 
  {
      loadFieldsNow = YES;
      if (!FieldsReaded)
      {
          [SQLR addField:elementName];
      }   
  }
  }
  
  -(void) parser:(NSXMLParser *) parser foundCharacters:(NSString *)string
  {
      chunksString = [chunksString stringByAppendingString:string]; 
  }       
  
  -(void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
  {
  NSString * finalString;
  finalString = [NSString stringWithFormat:@"%@",chunksString];
  
  if (loadErrNumNow)
  {
      [SQLR setErrorCode:[finalString intValue] ];
      loadErrNumNow = NO;
  }
  if (loadErrDesNow)
  {
      [SQLR setErrorDescription:finalString];
      loadErrDesNow = NO;
  }           
  
  if (Found)
  {
      if (loadFieldsNow) 
      {
          [tempRecord addObject:finalString]; 
      }
  }
  
  if ([elementName isEqualToString:@"Table"])
  {
      [SQLR addRecord:tempRecord];
      [tempRecord release];
      Found = NO;
      FieldsReaded = YES;
      loadFieldsNow = NO;
  
  }
  }
  
  -(void)dealloc
  {
      if (SQLR)
      { 
          [SQLR release];
          SQLR = nil;
      }
  
      [URLConnection release];
  
      [super dealloc];
  
  }
  @end
  </code></pre>
  
  <p>This is an absolutely buggy class because the leaks, every access is a leak :(</p>
  
  <p>Any help please?</p>