【问题标题】:Using function pointer member variables within an Objective-C Class在 Objective-C 类中使用函数指针成员变量
【发布时间】:2010-09-27 03:18:56
【问题描述】:

(Objective-C 新手,但精通 C/C++)。

目前我有一个 Objective-C 类,它的一些成员变量将是函数指针。这些函数指针只会被类本身修改,但可能被其他类使用。

我不确定如何设置对所述函数指针的访问。

我目前设想的解决方案是声明所述函数指针@public,据我了解,这将允许我使用 -> 运算符调用它们。这对我来说似乎相当不满意,因为函数指针对干预是开放的,并且它在健全的 OOP 面前飞行。

我的下一个倾向是使用@property,并将它们声明为只读。这似乎更加理智。我假设我会使用点运算符来调用它们,因为使用 getter 获取函数指针然后调用它的想法似乎完全可笑。

可以将函数指针用作属性吗?如果是这样,我将如何将这些声明为属性:

void (*sort)(SET, int) ;
char *(*toASCII)(CARD) ;

我觉得我在将这些声明为属性时遗漏了一点细微差别。

【问题讨论】:

    标签: objective-c class oop des


    【解决方案1】:

    我相信您应该能够将函数指针用作属性。你会这样做:

    @property (nonatomic, readonly) char *(*toASCII)(CARD);
    

    然后在你的实现中:

    @synthesize toASCII;
    

    然后

    object.toASCII();
    

    【讨论】:

    • 谢谢,这看起来不错。非原子的任何具体原因?我假设这是因为它是只读的,我不必担心丢失更新。如果我理解正确,这应该比保留原子效果更好。
    • 据我了解,原子与非原子在执行只读属性时没有区别。而且,对于指针和标量,非原子和原子访问器无论如何都是相同的(对指针或 32 位值的写入是原子的,因为它需要一条处理器指令)。然而,一般来说,非原子访问器比原子访问器执行得更好,因为它需要更多的努力来执行创建原子访问器所需的锁定等。
    • @JohnCarter nonatomic 已成为 Objective-C 中属性的事实默认值。当构建 Obj-C 属性时,人们设想线程将变得越来越流行,并且将代码明确标记为“线程不安全”(nonatomic)将使默认(atomic)更安全,尽管速度更慢。实际上,同一个应用程序线程并没有像他们想象的那样流行,许多应用程序大多是用单线程编写的,目的截然不同,它们之间有线程安全的“屏障”代码(桥梁)。 TL;DR:大多数 Obj-C 是 nonatomic b/c,或者至少以非原子开头。
    【解决方案2】:

    在您的@interface 中:

    @property(readonly) void (*sort)(SET, int);
    @property(readonly) char *(*toASCII)(CARD);
    

    在你的@实现中:

    @synthesize sort, toASCII;
    

    在您的 init 方法中(或您要设置函数指针的其他任何地方):

    sort = someFunction;
    toASCII = someFunction;
    

    在现代版本的 iOS 上,您甚至不需要添加 ivar(它会在您执行 @synthesize 时自动为您添加)。

    【讨论】:

    • 感谢关于不添加实例变量的提示,让事情看起来更好一点。
    猜你喜欢
    • 2012-05-17
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2018-09-12
    相关资源
    最近更新 更多