2013-03-19 2 views
11

포인터를 고유 키로 사용하는 한 쌍의 함수를 사용하고 있습니다. 키로 사용할 상수 포인터를 선언하고 싶습니다. 이 작업을 수행하는 가장 안전하고 명확한 접근 방법은 무엇입니까?상수 포인터를 선언하는 가장 확실한 방법은 무엇입니까?

여기에는 두 가지 접근 방법이 있지만 둘 다 짧은 임기가 있습니다.

  1. 자체의 참조 포인터 :

    static const void * const propertyKey = &propertyKey; 
    //... 
    objc_getAssociatedObject(object, propertyKey); 
    

    단점 : 선언이 길고 찾고 무서운! 그것이 무엇인지 모르는 사람을 쉽게 혼란시킬 수 있습니다. Upside : 사용하기 쉽도록 이해하면 어렵습니다.

  2. 참조해야 정적을 const :

    static const char propertyKey; 
    //... 
    objc_getAssociatedObject(object, &propertyKey); 
    

    단점 : 사용하면 변수는 놓치기 쉬운, 이는 단순히 사용하는 대신 참조해야합니다 (그러나 컴파일러는 형식 불일치로이 문제를 지적해야). 값이 할당되도록 선언을 수정하면 포인터의 고유성이 더 이상 보장 될 수 없으므로 심각한 영향을 미칠 수 있습니다. 위쪽 : 선언은 더 쉽게 할 수 있습니다.

나는 이것들 중 어느 하나가 즉시 명백하다고 생각하지 않는다. 더 좋은 제안이 있습니까?

+1

어떤 문제를 해결하려고합니까? – Sebivor

+0

정적 배열에 대한 포인터를 암시 적 배열의 키로 사용하면 아무런 이점이 없어 보입니다. 왜 정적 변수를 사용하지 않는가? – Sebivor

+0

@modifiablelvalue'objc_setAssociatedObject()'는 키가'void'에 대한 포인터가되어야하기 때문에. –

답변

2

가 나는 또한 첫 번째 아이디어를 좋아한다. 나는 그걸로 갈거야. 두 번째 아이디어는 컴파일러가 복수의 static const char 변수를 하나로 붕괴시킬 수있는 위험을 감수합니다. 컴파일러의 관점에서 볼 때 항상 값이 0 인 것으로 보장되므로 충분히 명확하지 않습니다. 그리고 첫 번째 아이디어보다 더 나은 해결책을 생각할 수 없습니다.

(설명의 토론에서 답변에 올리기)

1

3 : 아직 의미있는 고유 설정되어 포인터 :

static const void *const key = "PropertyKey"; 
+0

디버거에서도 좋은 결과를 얻을 수 있습니다. –

+11

문자열과 같이 고유합니다. 같은 문자열을 실수로 두 번 사용하면 충돌 할 수 있습니다. – JasonD

+1

기록을 위해, 나는 downvote하지 않았다. 나는 방금 관찰을했다. – JasonD

관련 문제