iPhone App2011. 7. 27. 11:19

저번에 XML에 파싱 부분을 올렸었다 소스를 올렸지만 그렇게 되면 메모리 관리가 제대로 안돼서 다시 만들었다.

일단 지난 번 코드를 보자

-(NSMutableArray*) parseContent:(NSURL*) url

{

NSXMLParser* xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];

[xmlParser setDelegate:self];

  

_hugeBoardDataArray =[NSMutableArray arrayWithCapacity:1024];

_elementStack = [NSMutableArray arrayWithCapacity:1024];

[xmlParser parse];

return _hugeBoardDataArray;

}

@end

보면 엉망이다 일단 arrayWithCapacity를 마땅히 쓸필요가 없고 _hugeBoardDataArray와 ElementStack을

- (id) init

{

if((self = [super init]) != nil)

{

_hugeBoardDataArray = [[NSMutableArray alloc] init];

_elementStack = [[NSMutableArray alloc] init];

}

  

return self;

}

생성자에서 이렇게 처리 하였다.


그리고 이부분은

-(NSMutableArray*) parseContent:(NSURL*) url

{

NSXMLParser* xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];

[xmlParser setDelegate:self];

[xmlParser parse];

[xmlParser release];

  

return [NSMutableArray arrayWithArray:_hugeBoardDataArray];

}

이렇게 고쳤다.

return 부분이 포인트다 무언가를 리턴할때 꼭 autoRelase로 만들어서 리턴해야 한다는 것을 깨달았다.

arraywitharray를 쓴이유다 만약 그냥 _hugeBoardDataArray를 리턴하게 되면 release를 해줘야 하는 타입임으로

저렇게 넣어서 했다.


그리고 data쪽도 new로 받았었는데

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict

{

if([elementName isEqualToString:@”HugeBoardInfo”] == TRUE)

{

HugeBoardData *data = [[HugeBoardData alloc] init];

[_elementStack addObject:data];

[data release];

}

else if([elementName isEqualToString:@”idx”] || [elementName isEqualToString:@”Name”] || [elementName isEqualToString:@”Title”] || [elementName isEqualToString:@”Description” ] || [elementName isEqualToString:@”Date”])

{

NSString *element = [NSString stringWithString:elementName];

[_elementStack addObject:element];

}

}

저렇게 alloc로 받도록 수정하였다.


마지막으로

-(void) dealloc

{

[super dealloc];

[_hugeBoardDataArray release];

[_elementStack release];

}

이렇게 메모리 해제는 꼭 해줘야 한다.




Posted by 동동(이재동)