iPhone SDK에 존재하는 경우에만 개체를 ​​제거하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1211927

  •  06-07-2019
  •  | 
  •  

문제

UIView에서 동적으로 Uilabel을 제거하고 싶습니다. 분기 및 반복이 있으며, 결국 'removefromsuperview'SDK 충돌로 더 이상 존재하지 않으므로 제거 할 때 결국, 일부 경우에는 더 이상 존재하지 않습니다.

[lbl_timer removeFromSuperview];

그래서 내가 원하는 것은 단순히 물체가 존재하는지 아는 방법입니다.

감사해요

도움이 되었습니까?

해결책

다양한 방식으로 해석 될 수있는 "존재"가 의미하는 의미에서 명확하게 설명해야합니다.

이 경우 객체의 retainCount가 귀하의 정의에 대한 정의를 충족시킬 수 있음을 알 수 있습니다. Objective-C의 메모리 관리에 익숙하지 않은 경우, 일단 객체의 retainCount가 0에 도달하면 거래가 처리되고 일반적으로 더 이상 존재하지 않는다는 것을 알고 있습니다.

if ([lbl_timer retainCount] >= 1) {
    // The object is owned/retained by at least one thing,
    // assuming a parentview is an owner
    [lbl_timer removeFromSuperview];
} else {
    // The object isn't retained by anyone
}

이것은 솔직히 가장 신뢰할 수 있거나 "안전한"방법이 아닙니다.

편집하다: 거래 된 개체에서 remeaincount가 호출로 인해 충돌이 발생할 수있는 요점이 제기되었습니다. 그 유형의 수표를 피하는 것이 가장 좋습니다. 아래 방법을 고수하는 것은 훨씬 안전해야합니다.


부모님 뷰가 없기 때문에 구체적으로 충돌하는 것을 알고 있다면 상위 뷰가 있는지 확인할 수 있습니다.

if ([lbl_timer superview] != nil) {
    [lbl_timer removeFromSuperView];
}

또한 : LBL_TIMER가 먼저 나오지 않도록하는 것이 더 안전 할 수도 있습니다.

if (lbl_timer != nil) {
    if ([lbl_timer superview] != nil) {
        [lbl_timer removeFromSuperView];
    }
}

다른 팁

"존재"라면 거래를하지 않았다는 것을 의미한다면, 그렇게 할 방법이 없습니다. 객체가 있던 메모리는 이미 새 객체로 대체되었을 수 있습니다. 그러나 객체가 처리 된 경우 슈퍼 뷰가 참조를 유지하기 때문에 슈퍼 뷰에서 이미 제거되어야합니다.

당신이 릴리스를하는 사람이라면, 당신은 lbl_timer 에게 nil 릴리스 직후 -removeFromSuperview NIL 물체로 보내지고 아무것도하지 않습니다. 가능하지 않으면 코드를 보여 주어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top