2017-03-16 8 views
0

참고 : NSMutableArray를 할당 한 다음 데이터를 할당하려고합니다. 내가 가진
: 잠재 누출 값이 NSMutableArray에서 읽지 않게 저장 됨

NSString *name=_txt_name.text; 
    if ([name length]==0) { 
     [email protected]""; 
    } 

또한

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"dd/MM/yyyy HH:mm:ss"]; 

    //below here i get leak 
    NSDate *dateStart = [[NSDate alloc] init]; 
    dateStart = [dateFormatter dateFromString:startDate]; 

편집 아래에서 누출

을 읽어 본 적이

내가 저장 여기에 값 코드 또한

NSMutableArray *responseArr=[[NSMutableArray alloc]init]; 
       responseArr =[response valueForKey:@"result"]; 

아래에서 누출 있어요 ARC 사용 중지 심지어 내가 아래 얻을 도달 클래스에 -fno-objc 아크를 사용하여

enter image description here

+0

무엇이 오류입니까? – Paulw11

+0

죄송합니다. 누출 오류가 발생하지 않았습니다. – iphonemaclover

+0

표시된 코드로 인해 누수가 발생할 이유는 없습니다. 변수를 작성한 다음 변수를 읽지 않으면 경고 메시지가 나타납니다. 컴파일러가 불필요한 작업을 수행 중임을 경고합니다 – Paulw11

답변

2

이 줄

NSMutableArray *responseArr=[[NSMutableArray alloc]init]; 

새로운있는 NSMutableArray를 할당하고 responseArr

이을에 대한 참조를 할당 누수 라인

responseArr = [response valueForKey:@"result"]; 

사전 (NSMutableArray에 대한 참조 일 수도 있음)에서 값을 가져와 responseArr에 할당합니다. 이 시점에서 할당 된 원래 NSMutableArray에 대한 참조가 더 이상 존재하지 않으므로 할당이 해제됩니다.

당신은 그냥 말할 수있다 : 당신의 날짜 코드와 유사하게

NSMutableArray *responseArr = (NSMutableArray *)response[@"result"]; 

을, 당신은 말할 수 :

NSDate *dateStart = [dateFormatter dateFromString:startDate]; 

은 그것을 멀리 던져, 초기 값을 할당 할 필요가 없습니다.

ARC를 사용한다고 가정 할 때 표시된 코드 중 누수가 발생하지 않습니다.

ARC를 사용하지 않는 경우 ARC!

+0

그는 ARC를 사용하지 않습니다. –

+0

hello @paulw 은 입니다. NSMutableDictionary * 데이터 = [NSMutableDictionary new]; 데이터 = (NSMutableDictionary *) [arrData objectAtIndex : indexPath.row]; 상당 => NSMutableDictionary * 데이터 = (NSMutableDictionary *) [arrData objectAtIndex : indexPath.row]; – iphonemaclover

+0

종류입니다. 첫 번째 경우에는 사전을 할당하고 버릴 필요가 없습니다. 두 번째 경우에는 그렇지 않지만 두 경우 모두 '데이터'는 동일한 값을 갖습니다. – Paulw11

1

A. 먼저 자신의 +alloc에 할당 균형을 가지고 MRC (MRR)를 사용하여

스 니펫 :

NSMutableArray *responseArr = [[NSMutableArray alloc]init]; 
       responseArr = [response valueForKey:@"result"]; 

당신이 NSArray의 인스턴스를 할당 첫 번째 줄에서. 나중에 (자동) 해제해야합니다. 그렇지 않으면 메모리 누수가 발생합니다. 나는 당신이 NSArray의 인스턴스를 -valueForKey을 사용하여 만들고이 새로운 참조의 값을 responseArr에 할당하는 것을 오해했다고 생각합니다. 따라서 변경 가능한 배열은 필요하지 않습니다. 두 개의 객체를 새로 만든 다음 하나만 참조하면 이전 객체를 놓을 수 없습니다.

은 다음과 같이 뭔가를 수행

NSArray *responseArr = [[NSArray alloc]init]; 
NSArray *resultArr =[response valueForKey:@"result"]; 
[responseArr release]; 

당신은 할 필요가 없습니다가 +alloc-init으로 생성되지 않기 때문에, resultArr에 의해 참조되는 객체. Here 소유권을 소개합니다.

B. 셋째

그것은 마지막 예제와 동일

스 니펫 :

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 

당신 + ALLOC-init을 해당 인스턴스 개체,하지만 코드에서 어떤 자료가 없습니다. 따라서 참조 번호 dateFormatter이 범위 (수명)를 잃으면 더 이상 해제 할 수 없습니다. 이자형. 메서드에서 반환됩니다.

방법의 끝 부분에이 코드를 추가

[dateFormatter release]; 

C. 둘째 니펫을

두 번째 예는 다른 문제가있다 : 당신은 변수를 사용하지 않고 VAR name에 값을 할당 아래 코드. 따라서 값을 할당하는 것은 의미가 없습니다.