2010-07-20 3 views
-1

업데이트 코드내 retainCount 4의 경우 아이폰

- (void) searchBarSearchButtonClicked:(UISearchBar *)theSearchBar { 
    mytimer3=[NSTimer scheduledTimerWithTimeInterval:.03 target:self selector:@selector(show) userInfo:nil repeats:NO]; 


     NSLog(@" search is down"); 



    //////////// rnd to hold keyboard 





    //ovController.view.backgroundColor = [UIColor grayColor]; 


    self.tableView.scrollEnabled = NO; 




    UserText=[self.searchDisplayController.searchBar text]; 
    myInt= UserText.length; 
    //int myInt= [save length]; 



    // NSString *myStringPrt1 = [[NSString alloc] init]; 
    // NSString *myStringPrt2 = [[NSString alloc] init]; 


    if(UserText.length>3) 

    { 
    //[ovController.view removeFromSuperview]; 
    //[tableView reloadData]; 
    url=nil; 
    // [email protected]"http://find.php?keyword="; 
    NSString * myStringPrt2=UserText; 
    // myStringPrt1=[myStringPrt1 stringByAppendingString:myStringPrt2]; 
    // myStringPrt1 = [myStringPrt1 stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 

    // loadingView.hidden=NO; 




     NSString *outputString = [[NSString stringWithString:@"http://find.php?keyword="] stringByAppendingString: UserText]; 
     outputString = [outputString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 


     NSLog(@"My string is now = %@", outputString); 


    url= [NSURL URLWithString:outputString]; 



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

    //Initialize the delegate. 
    XMLParser *parser = [[[XMLParser alloc] initXMLParser]autorelease]; 

    //Set delegate 
    [xmlParser setDelegate:parser]; 

    //Start parsing the XML file. 
    BOOL success = [xmlParser parse]; 
    if(success) 
    { 



     [super viewDidLoad]; 




    [self searchTableView];  
     mytimer4=[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(wipe) userInfo:nil repeats:NO]; 
    } 


    } 

}

+3

. 그대로, 아무도 코드가하는 일이나 작성한 방법을 알지 못하므로 4를 보유하면 아무 것도 알려주지 않습니다. – Jasarien

+0

질문을 다시 말하면 될까요? 나는 네가하는 일을 이해하지 못한다. –

+0

보유 개수가 극도로 오도 된 수 있으며 메모리 오류를 찾는 데 거의 사용되지 않아야한다고 언급해야합니다. – cobbal

답변

5

오른쪽, 당신은 사방에 메모리 누수가 있습니다

NSString *myStringPrt1 = [[NSString alloc] init]; 
NSString *myStringPrt2 = [[NSString alloc] init]; 

url=nil; 

[email protected]"http://wap?keyword="; //MEMORY LEAK, this will assign a new string to myStringPrt1, without releasing the first one 
myStringPrt2=UserText; //MEMORY LEAK, this will assign a new string to myStringPrt2, without releasing the first one 

myStringPrt1=[myStringPrt1 stringByAppendingString:myStringPrt2]; //MEMORY LEAK, this will assing an autoreleased string the myStringPrt1, without releasing the old one first. 
myStringPrt1 = [myStringPrt1 stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; //MEMORY LEAK, this will assing an autoreleased string the myStringPrt1, without releasing the old one first. 

내가 쿠비로 표시된 바와 같이 먼저 메모리 관리 지침을 읽으십시오. 또는, 당신은 게으른 기분 경우,이를 사용

NSString *outputString = [[NSString stringWithString:@"http://wap?keyword="] stringByAppendingString: UserText]; 
outputString = [outputString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 

또는이 :

당신은 당신의 질문에 정교하게, 어쩌면 당신이 작업하고있는 코드의 일부를 표시해야합니다
NSString *outputString = [NSString stringWithFormat:@"http://wap?keyword=%@",UserText]; 
outputString = [outputString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
+1

@Rengers '요점을 요약하면 수동으로 보유 된 NSString 객체를 사용하는 것이 거의 올바른 선택이 아닙니다. autoreleased 객체를 반환하는 NSString의 편리한 생성자는 거의 항상 사용하기 쉽고 메모리 문제를 해결할 수 있습니다. –

+0

실제로, 두 개의 누수는'myStringPrt1 = @ "http : //wap? keyword =";'와'myStringPrt2 = UserText;' –

+0

@tc입니다 :'url = nil' 이후의 모든 5 개의 할당은 누설을 야기합니다. – JeremyP

0

없음이 귀하의 요구 사항 및 객체 할당에 따라, 당신의 유지 카운트가 확실히 증가에 대한 나쁜 것입니다. 그러나 할당 된 모든 객체를 적절한 위치와 적절한 시간에 릴리스하는 것을 명심해야합니다.

+0

NSString * myStringPrt1 = [[NSString alloc] init]; NSString * myStringPrt2 = [[NSString alloc] init]; \t \t //if(UserText.length>3 \t { \t //[ovController.view removeFromSuperview] \t // [있는 tableView reloadData] \t URL = 전무, \t myStringPrt1 = HTTP "@ // WAP 키워드 = "; \t myStringPrt2 = UserText; \t myStringPrt1 = myStringPrt1 stringByAppendingString : myStringPrt2] \t myStringPrt1 = myStringPrt1 stringByAddingPercentEscapesUsingEncoding : NSUTF8StringEncoding] 후 후 PA 내가 추적 할 때 xring을 보내라 그 값은 4 NSLog (@ "보유 cccd % d", [myStringPrt1 retainCount]);/그 4 – ram

+0

사용자가 검색 버튼을 누른 다음 위의 행을 호출하면 내가 언제 릴리스해야합니까? myStringPrt1 및 myStringPrt2 또는 할당하지 않고 사용해야합니까 ?? – ram

+0

한 가지 더 malloc : *** 오류가있는 개체 0x4696730 : 해제 된 포인터가 할당되지 않았습니다. *** 디버그를 위해 malloc_error_break에 중단 점을 설정하십시오. Wat2Eat (6945,0xa01a7500) malloc : *** 개체에 대해 오류가 발생했습니다. 0x4696770 : double 무료 ##################### 수 있습니다. 메모리 누출로 연결 되나요? – ram

4

보유 수량에주의하지 마십시오. 그 숫자는 통제에서 완전히 벗어나서 그 숫자가 왜 그런지를 알아 내려고 노력하면 미칠 것입니다.

Obj-C memory management guidelines에 따라 leaks detector in Instruments을 사용하고 빌드시 static analyzer을 실행하십시오. 네가 그렇게하면 괜찮을거야.

+0

누수 detectetor를 사용하는 방법 주셔서 감사합니다 ??? 나는 당신이 당신의 코드가 효율적이라는 것을 알 것이다. 나는 얇은 핑크색 애호가들과 함께이 그래프를 보았지만 무엇이 plz인지 설명하지 못했습니다. – ram

+1

@ram : kubi는 문서에 대한 링크도 제공했습니다. 자신에게 호의를 베풀고 * 읽으십시오. – JeremyP

관련 문제