2012-04-09 2 views
0

저는 Region이라는 코스튬 클래스가 있습니다.이 코드를 사용하여 region 변수를 초기화하고 있습니다.이 코드의 끝에 myAppDelegate.provisoryRegion이 nil이 아니며 nil이 아닌가요? ?? region에 대한 참조로 전달 된 myAppDelegate.provisoryRegion이 아닙니까? 저는이 코드 조각이 끝날 때 영역이 0이 아닌지 100 % 확신합니다.포인터 및 참조

Region *region=myAppDelegate.provisoryRegion; 
if (!myAppDelegate.provisoryRegion) { 
    myAppDelegate.provisoryRegion=[[Region alloc]init]; 
} 
if (!region){ NSLog(@"region is nil"); 
} 

답변

1

예. 그것은 없어야합니다. 개체를 변경했기 때문에!

myAppDelegate.provisoryRegion=[[Region alloc]init]; myAppDelegate.provisoryRegion이 새 오브젝트 (힙의 새 주소)를 가리킬 때.

*region 새 주소를 따르십시오!

따라서 *region은 여전히 ​​NULL 주소를 가리 킵니다.

하지만 왜 1 행에서 포인터를 복사합니까? 항상 myAppDelegate.provisoryRegion을 사용하지 않는 것이 좋습니다.

myAppDelegate.provisoryRegion=[[Region alloc]init]; 

처럼 보이는 ...

if (!myAppDelegate.provisoryRegion){ NSLog(@"region is nil"); 
} 

그리고 그런데 : *region은 그냥 샘플 더미 코드에서 마지막에 할 라인을 삭제 myAppDelegate.provisoryRegion

의 연결되지 않은 별명입니다 메모리 누수 (@property가 retain으로 설정된 경우). 함께

수정 :

myAppDelegate.provisoryRegion=[[[Region alloc] init] autorelease]; 
+0

myAppDelegate에 대한 내 참조가 약한 참조 인 ARC가 잘 작동하기 때문에 누출이 없을 것이라고 생각하므로 ARC를 사용하고 있습니다. 이제 알았습니다. 코드 영역이 어디에도 없습니다. myAppDelegate.provisoryRegion에는 절대 포인트가 없습니다. 대단히 고마워요 ... BTW 저는 myAppDelegate.provisoryRegion을 몇 번 사용해야하므로 코드를 사용하고 있습니다. 그래서 편의성 문제로 대신 영역을 호출합니다 ... – user1162866

1

region는 메모리 어드레스를 포함하는 변수이다. myAppDelegate.provisoryRegion은 메모리 주소를 포함하는 다른 변수입니다.

코드 myAppDelegate.provisoryRegion의 첫 번째 줄은 region도 전무의 메모리 주소, myAppDelegate.provisoryRegion하지 메모리 주소를 포함 즉 당신이 다음 region에 복사 전무의 메모리 주소가 포함되어 있습니다.

다음은 myAppDelegate.provisoryRegion이 nil인지 테스트합니다. 따라서 myAppDelegate.provisoryRegion의 내용을 Region 인스턴스의 메모리 주소로 설정합니다.

영역은 아직 메모리 주소가 nil 인 완전히 다른 변수입니다. 그래서, 마침내 당신이 region을 테스트 할 때 그것은 여전히 ​​0입니다.

+0

잘 이상하게 보입니다. 왜냐하면 나는 region = nil이라고 쓰지 않기 때문에 region = myAppDelegate.provisoryRegion을 쓴다. 그래서 myAppDelegate.provisoryRegion을 변경하면 myAppDelegate.provisoryRegion이 저장되는 메모리 주소에 대한 포인터가된다. 메모리 주소는 변경되어야한다. 너무 바뀌지?모든 포인터가 그런 식으로 작동 한 후에? – user1162866

+0

희망을 갖고 조금 더 명확하게 대답을 업데이트했습니다. – mttrb