2016-10-13 12 views
-1

가 나는 말한다 Crashlytics에 충돌과 함께 며칠 붙어 있었어요 이 충돌의 원인이 될 수 있습니다. __NSThreadPerformPerformobjective-c에서 performselector를 사용하면 위험합니까? I가 보이는 지적 관리</p> <p><strong>libobjc.A.dylib</strong></p> <p><strong>objc_msgSend</strong></p> <p>을 :

스택을 조금 검색하면 performSelector : withObject : afterDelay :

코드에는 항상 지연 이 언급되어 있습니다. 이 메서드를 사용하여 열거 형 상태에서 액세스하는 문자열 배열에서 선택기를 동적으로 다시 작성하여 iOS에서 "펑터"라고 부를 수 있습니다.

기본적으로 이것은 내가 가지고있는 모든 정보입니다. afterDelay :은 다음 RunLoop으로 지연됩니다. performSelector : withObject : 또는 afterDelay :이이 문제를 일으키는 방법에 무엇인가를 추가합니까?

그리고 마지막으로, 진짜 질문 : 펑를 만들 수있는 좋은 방법, 또는이처럼 사용하는 것이 위험하다, 나는 다른 방법으로 일을해야한다 : withObject : afterDelay

가 performSelector인가? 사전에

감사합니다,

+0

Objective-C의 모든 요소와 마찬가지로 performSelector는 개발자에게 오류가 발생하기 쉽고 많은 objc_msgSend 충돌을 일으킬 수 있습니다. 이 오류는 대개 잘못된 객체에서 셀렉터를 호출하여 발생합니다 (호출해야하는 객체는 아마도 할당이 해제되어 있습니다.) –

+0

예,하지만 이런 종류의 정보를 알고 있고 정상적인 방법으로 충돌 할 수 있습니다. 포인터를 사용하여. 하지만 여기에서는 내가 호출하는 순간 내 객체를 어떻게 할당 해제 할 수 있는지를 볼 수 없으며 심지어 다음 실행까지 기다리는 경우에도 볼 수 없습니다. IBOutlet 만 사용하여 동일한 ViewController에 머물러 있으면 내 객체를 어떻게 할당 해제 할 수 있는지 보여줍니다. "메모리 경고"문제가 원인 일 수 있습니까? ARC는이 사건에 대한 중요한 재원을 계속 가져야합니다. –

+0

디버그 구성에 좀비 모드를 사용하도록 설정하십시오. 충돌을 복제하면 무엇이 잘못되었는지를 알려야합니다. –

답변

0

은 당신의 개체가 여전히 존재하고 선택을 수행 할 수 있다고 가정하지 마십시오. 전에 테스트 해!

if ([someObject respondsToSelector:@selector(someSelector)]) { 
    [someObject performSelector:@selector(someSelector) withObject:nil]; 
} 
+0

고마워,이 하하를 어떻게 잊었는지 모르겠다. –

+0

글쎄, 존재하지 않는 객체 (변수가'nil' 임)는 문제가되지 않습니다. 선택기를 수행하지 않는 객체는 문제가 될 수 있지만 객체가 프로그래머가 생각하는 바가 아니라는 것을 나타냅니다. – newacct