2011-01-13 2 views
20

이 질문을 게시하기 직전을 포함하여 여러 차례 "정적"으로 읽었습니다. 나는 여전히 "아하"를 찾고 있습니다. jQuery과의 정적의 맥락에서 정적 키워드가 UITableViewCell 식별자에 사용되는 이유는 무엇입니까?

내가 검토 한 코드의 모든 부분에 셀 식별자에서 제공됩니다. 최근 CellForRowAtIndexPath의 예를 들어 우리가 필요로하고 "정적"을 사용 않는 이유

static NSString *defaultIndentifier = @"Managed Object Cell Identifier"; 

내 질문은?

답변

11

그래서 한 번만 구성됩니다. 그것은 정적이 아니라면, 당신은 하나를 (많이가) 메시지가 전송 될 때마다

+0

. 그러나 컴파일러가'@ "식별자를 상수로 컴파일 할 때'int i = 3; '이라고 말하는 것만 큼 비쌉니다. 정적 문자열이 실제로 사용되는 유일한 시간은 문자열이 상수 문자열을 사용하는 대신 런타임에 작성되는 경우입니다. –

+1

여전히 이점이 있습니다. 메소드가 실행될 때마다 두 개의 프로세서 사이클이 끊어집니다 (많은 경우). – ughoavgfhw

+0

@ughoavgfhw 예, 그렇지만 바이너리를 더 크게 만들고 앱이 더 많은 메모리를 사용하도록하지는 않습니까? – ma11hew28

18

여기에 실제 혜택은 없습니다를 만드는 것입니다. 대부분이 독자에게이 특정 비트의 모든 셀에 동일한 값이 사용된다는 힌트 일뿐입니다. 식별자 자체는 상수 문자열이므로 메모리의 불변 덩어리로 컴파일되고 매번 동일한 포인터로 참조됩니다. static 키워드를 제거하더라도 문자열을 작성하는 데 드는 비용은 들지 않습니다.

+0

"식별자 자체가 상수 문자열입니다." – Philip007

0

내 생각에 문자열을 정적으로 선언하면 -dequeueReusableCellWithIdentifier:CellIdentifierforIndexPath:에 매번 동일한 포인터가 사용됩니다 (정적으로 선언 된 변수는 힙에서 한 번만 할당되므로 프로그램 실행 초기에 사용됨))

[NSString -isEqualToString:]은 대체로 포인터 비교를 수행하기 위해 구현되었으며, 그 다음으로는 각 반복에서 몇 사이클을 줄일 수 있다고 생각되는 대체 문자와 문자 비교를 수행했습니다.

(a) 테이블 셀 재 채우기가 일반적으로 매우 작은 셀 집합에서 작동하고 잘 최적화되어 있으며 (b) 테이블 새로 고침이 번쩍 거리는 경우가 많습니다. 한 번 발생하고 사용자가 스크롤하거나 응용 프로그램 논리가 내용을 변경하기 전까지는 다시 발생하지 않습니다. -reloadTable을 초당 100 번 호출하면 결국 응용 프로그램 논리에 문제가있는 것입니다.

나는 정적 키워드가 흔적 기존 규칙 의심 - 어쩌면 다시 하루에, 애플은 오히려 적절한 문자열 비교 수행하는 것보다, 포인터에 해시. "한 때마다 만들기"에 의해 무슨 뜻 확실 "스택 변수로 상수 포인터를 밀어"경우

관련 문제