2013-03-19 62 views
11

我正在使用一对使用指针作为唯一键的函数。我想声明一个常量指针用作键。做这件事最安全和最清晰的方法是什么?声明一个常量指针最清晰的方法是什么?

这里有2点可能的方法,但它们都具有短的缺憾。

  1. 自参考指针:

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

    缺点:该声明是漫长而可怕的期待!可能容易混淆不知道它的用途的人。 上行链路:一旦你明白它的功能,很难使用。

  2. 应引用的静态常量:

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

    缺点:用于当可变必须参照而不是简单地使用,这是很容易错过(但编译器应该指出这一点作为一个类型不匹配)。如果修改声明以便赋值,那么它可能会产生灾难性影响,因为指针的唯一性无法保证。 上行:声明更容易理解。

我不认为这些是立即明显的。有更好的建议吗?

+1

哪些问题是你想解决? – Sebivor 2013-03-19 10:08:43

+0

我问,因为似乎没有任何好处使用静态变量的指针作为关键数组。为什么不使用静态变量? – Sebivor 2013-03-19 10:11:06

+0

@modifiablelvalue因为'objc_setAssociatedObject()'要求键是指向'void'的指针。 – 2013-03-19 10:12:33

回答

2

我也喜欢你的第一个想法。我只想跟那个一起去。你的第二个想法冒着编译器可能将多个变量合并为一个的风险,因为它们保证始终保持值0,并且从编译器的角度来看,我并不积极,它们足够独特。我想不出比你的第一个想法更好的解决方案。

(从评论的讨论提升到一个答案。)

1

3:被设置为有意义的事情而独特的指针:

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

在调试器中看起来很不错。 – 2013-03-19 10:18:30

+11

它只与字符串一样独特。如果相同的字符串被意外使用了两次,可能会发生冲突。 – JasonD 2013-03-19 10:26:48

+1

为了记录,我没有downvote。我只是做了一个观察。 – JasonD 2013-03-19 10:56:56

相关问题