iPhone SDK에 존재하는 경우에만 개체를 제거하는 방법은 무엇입니까?
-
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 물체로 보내지고 아무것도하지 않습니다. 가능하지 않으면 코드를 보여 주어야합니다.