2010-07-16 1 views
0

OpenFlow 인스턴스의 이미지를 필사적으로 변경하려고합니다. 나는 이제 인스턴스를 제거하고 새 인스턴스를 만들려고 노력하고 있습니다. 하지만 난 애플 리케이션을 충돌 피할 수 없다.OpenFlow가 응용 프로그램을 재설정/재 작성하려고 시도 할 때 오류가 발생합니다.

를 작성하는 코드는 다음과 같습니다

AFOpenFlowView *of = [[AFOpenFlowView alloc] initWithFrame:CGRectMake(0, 100, 320, 380)]; 
[of setCenter:CGPointMake(160, 240)]; 
[of setBackgroundColor:[UIColor blackColor]]; 
[of setDataSource:self]; 
[of setViewDelegate:self]; 

[self setPeopleFlow:of];  
[self.view addSubview:peopleFlow]; 

[of release]; 

그럼, 내가 할 버튼 클릭에 :

[peopleFlow removeFromSuperview]; 
[peopleFlow release]; 

나중에 내가 코드의 첫 번째 블록과 같은 함수를 호출에 다시 만들면 응용 프로그램이 로그 오류없이 중단됩니다.

OpenFlow 개체를 제거/다시 만들지 않고 다시 채우는 방법에 대한 아이디어가 있으십니까? 또는 어떻게 안정적으로 생성/재 작성 하는가?

+0

[peopleFlow release]가 실제로 필요한가요? 그것이 추가 된보기에서 떨어져 어딘가에 유지 되었습니까? – willcodejavaforfood

답변

0

당신이 peopleFlow 인스턴스를 만들 때이 카운트가 그 다음 2

입니다 유지, 그래서 그것은 당신이 하위 뷰로 추가 할 때 1

의 유지 카운트가 그런 슈퍼 뷰를 유지있다 superview에 추가 한 후에 그것을 놓으므로 보유 수는 다시 1이됩니다.

그런 다음 superview에서 제거하고 superview에서 해제하므로 보유 수는 0이고 해당 객체는 할당이 해제됩니다.

그런 다음 다시 시도하고 놓으십시오. release을 할당 해제 된 개체에 보내므로 충돌합니다.

요약하면이 경우 superview에서 제거한 후에 해제 할 필요가 없습니다.

또한 포인터를 해제하고 더 이상 가리키는 점에 신경 쓰지 않으면 포인터에 nil을 할당하는 것이 좋습니다. 이는 객체를 릴리스하고 할당을 해제 한 후에 포인터 변수가 객체가 점유하는 데 사용 된 메모리를 여전히 가리키기 때문입니다. 포인터에 nil을 지정하면 매달려있는 포인터가 가리키는 위치에 메시지를 보내려고하면 나쁜 일이 일어나지 않습니다.

+0

정말 고마워. 보유 계산이 어떻게 작동했는지 나는 이해하지 못했습니다. 그러나 나는 더 나은 이해를 지금 느낀다. 화려한 대답. – jordi

관련 문제