2013-03-19 20 views
11

Używam pary funkcji, które używają wskaźnika jako klucza unikatowego. Chcę zadeklarować stały wskaźnik do użycia jako klucz. Jakie jest najbezpieczniejsze i najczystsze podejście do tego?Jaka jest najczystsza metoda deklarowania stałego wskaźnika?

Oto 2 możliwe podejścia, ale oba mają krótkie niedociągnięcia.

  1. Self wskaźnik adresowe:

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

    Wada: deklaracja jest długa i przerażające spojrzenie! Może łatwo zmylić kogoś, kto nie wie, do czego służy. Upside: Twardy, gdy zrozumiesz, co robi, jest łatwy w użyciu.

  2. A static const, które powinny zostać odniesione:

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

    Wada: Kiedy używany jest zmienna musi odwoływać się raczej niż po prostu używany, który jest łatwo przegapić (ale kompilator powinien zwrócić na to uwagę jako rodzaj niedopasowania). Jeśli deklaracja zostanie zmodyfikowana w taki sposób, że zostanie przypisana wartość, może to mieć katastrofalne skutki, ponieważ unikalność wskaźnika nie może być dłużej gwarantowana. Upside: Deklaracja łatwiej jest grzebać.

Nie sądzę, że którekolwiek z nich jest od razu oczywiste. Jakieś lepsze sugestie?

+1

Który problem próbujesz rozwiązać? – Sebivor

+0

Pytam, ponieważ wydaje się, że nie ma pożytku z używania wskaźników do zmiennych statycznych jako kluczy dla tablic macierzowych. Dlaczego po prostu nie używać zmiennych statycznych? – Sebivor

+0

@modifiablelvalue Ponieważ 'objc_setAssociatedObject()' wymaga kluczy do wskaźników do 'void'. –

Odpowiedz

2

Lubię też swój pierwszy pomysł. Po prostu z tym idę. Twój drugi pomysł wiąże się z ryzykiem, że kompilator może zwinąć wiele zmiennych static const char w jeden, ponieważ gwarantują one zawsze zachowanie wartości 0 i, z punktu widzenia kompilatora, nie jestem pewien, że są wystarczająco różne. I nie mogę wymyślić lepszego rozwiązania niż twój pierwszy pomysł.

(Podniesione do odpowiedzi z dyskusji w komentarzach.)

1

3: wskaźnik, który jest ustawiony na coś sensownego jeszcze wyjątkowy:

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

Jest szansa, że ​​to ładnie wygląda w debugerze. –

+11

Jest tylko tak unikalny jak ciąg. Jeśli ten sam ciąg przypadkowo został użyty dwa razy, może się zderzyć. – JasonD

+1

Dla przypomnienia nie padłem. Właśnie zrobiłem obserwację. – JasonD

Powiązane problemy