2010-09-27 79 views
1

(Objective-C的新手,但熟悉C/C++)。在Objective-C類中使用函數指針成員變量

目前我有一個Objective-C類,它的一些成員變量將是函數指針。這些函數指針只會被類本身修改,但可能被其他類使用。

我不知道如何設置對所述函數指針的訪問。

我目前所設想的解決方案是聲明所述函數指針@public,據我瞭解,它將允許我使用 - >運算符來調用它們。這對我來說似乎不太令人滿意,因爲函數指針是可以插入的,它會在聲音OOP中飛行。

我的下一個傾向是使用@property,並聲明它們是隻讀的。這似乎更理智。我假設我會使用點運算符來調用它們,因爲使用getter來獲取函數指針然後調用它的想法看起來完全可笑。

可以使用函數指針作爲屬性嗎?如果是這樣,我怎麼會去聲明這些是屬性:

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

我有一種感覺,我缺少一個輕微的細微差別來聲明這些作爲屬性。

回答

1

我相信你應該能夠使用函數指針作爲屬性。你會做這樣的:

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

然後在您的實現:

@synthesize toASCII; 

然後

object.toASCII(); 
+0

謝謝,這看起來不錯。非原子的任何具體原因?我假設這是因爲它是隻讀的,我不必擔心丟失的更新。如果我理解正確的話,這應該比它保持原子性能更好。 – 2010-09-27 03:34:14

+0

從我的理解中,原子vs非原子在做只讀屬性時沒有什麼區別。並且,對於指針和標量,非原子和原子訪問器是相同的(對指針或32位值的寫入是原子的,因爲它只需要一個處理器指令)。但是,一般來說,非原子訪問器比原子訪問器執行得更好,因爲它需要更多的努力來完成創建原子訪問器所需的鎖等。 – Jacques 2010-09-27 03:56:47

+1

@JohnCarter'nonatomic'已經成爲Objective-C中屬性的事實上的默認值。當Obj-C屬性被炮製時,設想線程化將變得越來越流行,並且將代碼標記爲顯式地「線程不安全」('nonatomic')會使默認('atomic')更安全,儘管更慢。實際上,同樣的應用程序線程沒有像他們認爲的那樣趕上,許多應用程序大多數都是用單線程編寫的,用於完全不同的目的,線程安全的「屏障」代碼(橋樑)在它們之間。 _TL; DR:它是'nonatomic' b/c大多數Obj-C是,或者至少以nonatom開始。 – 2015-02-17 07:19:00

1

在你@interface:

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

在你@implementation:

@synthesize sort, toASCII; 

在你的init方法(或其他任何地方,你要設置的函數指針):

sort = someFunction; 
toASCII = someFunction; 

在iOS上的現代版本,你甚至都不需要添加伊娃(它被添加自動爲你做@synthesize時)。

+0

感謝您提示不添加實例變量,使事情看起來更好看。 – 2010-09-27 03:41:34