2014-10-19 2 views
-1

나는 사용자 정의 SplitViewController와 TabBar의 설정을 사용하고 있습니다 아이 패드 응용 프로그램이 (A의 ViewController에 의해 제어) 표준 왼쪽 테이블 메뉴에서 선택에 DetailViewController에 의해 제어되는 오른쪽 (가로 방향)으로 내용을 변경하십시오. 이것은 잘 실행되고 App Store에 있습니다. Xcode 5.1.1을 사용하여 ARC 및 iOS7로 업데이트하는 중입니다. 변환이 작동하고 프로그램이 시뮬레이터에서 정상적으로 실행되는 것 같습니다. 그러나 각보기의 didSelectRowAtIndexPath 메서드에서 경고를받습니다. 클래스, StylesViewController의 예를 들면 다음과 같습니다아이 패드를 tableView 행 선택 코드 경고

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [(StylesDetailViewController *)detailViewController initWithIndexPath:indexPath]; 
    [((StylesDetailViewController *)detailViewController).masterPopover dismissPopoverAnimated:YES]; 
} 

은 (단지 풍경을 지원하는 두 번째는 아마도 응용 프로그램으로 사용되지 않음)와 "사용되지 않는 표현의 결과"인 경고가 첫 번째 줄입니다. 프로그램이 충돌하지 않으므로이 경고를 무시할 수 있다고 가정합니다. 그러나 애플을 알고, 나는 검토를 위해 경고와 함께 애플 리케이션을 제출하지 않는 것이 좋습니다. 누구든지 '표현의 결과'를 사용하여 컴파일러를 침묵시키는 무해한 문장을 제안 할 수 있습니까?

+0

첫 번째 코드 줄은 의미가 없습니다. 왜 인스턴스 변수에'init' 메서드를 호출할까요? 'init'에 대한 호출은 항상 클래스의 새로운 인스턴스를 생성하기 위해'alloc'과 함께 호출되어야하고 결과는 어떤 변수에 할당되어야합니다. – rmaddy

+0

확실하지 않습니다. 나는 앱의 아이폰 버전 (내 첫 앱)에 표준 코드를 가지고 있었지만 iPad 앱 버전에서 탭바를 구현하는 데 어려움을 겪었다. 코드를 기반으로하는 SplitViewController를 작성한 사람의 예를 든다. 내가 이것을 녹이기 시작한 지 약 1 년이 지났어. – David

+0

하지만 ID에 결과를 할당해도 아무런 쓸모가 없지만 분석기를 행복하게 유지하려면 무언가를해야합니다 (아래 ctrahey에 대한 설명 참조). – David

답변

1

동일한 코드 줄에서 생성되지 않은 개체에 대한 선택자에서 'init'문자열로 메시지를 보내는 것은 iOS/Objective-C에서 안티 패턴과 같이 중요합니다. 세부 사항은 전혀 필요하지 않습니다,하지만 정보의 중요한 (관련) 비트는 기술적으로 '초기화하기'방법은 실제로 다른 객체 메시지가 보내진 것보다로 허용되는, id를 반환한다는 것입니다!

귀하의 경고는 단순히 그 객체를 사용하지 않는 당신을 말하고있다. 그것의 alloc 라인 외부에서 init 메소드를 호출하면 다른 다루기 힘들 수 있습니다. 이 답변에

한 가지주의 : 구체적인 내용은 확실히 문제가되는 방법 당신의 구현에 따라 달라집니다, 그 방법 (최소한의 서명)를 게시하는 것은 도움이 될 것입니다. 그러나 그 방법을 사용하여 alloc 단계에서 반복해서 발생할 수있는 방식으로 객체를 프라이밍하는 경우에도 이름에 init 문자열 사용을 피하는 것이 좋습니다 ... loadWith... 또는 비슷한 것을 사용하고 싶습니다.

+0

확인. initWithIndexPath 메소드 (배운 책에서 사용 된 이름)는 패스를 전달하므로 DetailView는 선택된 행과 관련된 항목을 찾아서 표시 할 수 있습니다. 위의 줄에 id foo를 할당하고 foo = nil을 할당하는 해킹을 시도하면 프로그램이 실행되고 "사용되지 않은 표현식 결과"가 사라집니다. 그러나 분석기를 실행하면 'Dead Store'경고 (노란색이 아닌 파란색)가 나타납니다. "초기화 중에 foo에 저장된 값은 읽히지 않습니다". 다시 말하지만, 무해한,하지만 애플의 리뷰어 마음과 Xcode는 이런 종류의 경고가 사라지게 Eclipse와 같은 스위치가 있습니까? 또는 무엇을? – David

+0

내가 말하는 것은 정확히 어디에서 alloc을 호출 하는지를 제외하고는 어디에서도 init을 호출하지 않는 것입니다. 객체가 필요로하는 정보가 생성되었을 때 사용할 수 없다면, 객체에게 필요한 데이터를주는 다른 (초기화되지 않은) 메소드를 만드십시오. –

+0

하지만 alloc을 명시 적으로 호출하지는 않습니다. http://stackoverflow.com/questions/13495464/에 따르면 메모리는 ARC에 의해 할당되고 이런 종류의 상황에서 자동으로 사용됩니다.덧붙여서 foo에 doNothing 메서드를 호출하여 경고를 제거 할 수 있습니다. 끔찍한 해킹. – David