2011-09-11 44 views
2

有幾個使用FSEvent來偵聽文件系統中的更改的示例。在FSEventStreamCreate中聲明回調函數

How to listen for file system changes MAC - kFSEventStreamCreateFlagWatchRoot

FSEvents weirdness on OS X Leopard

FSEventStreamCreate創建活動,他們似乎都經過回調項就好了。沒有參數或任何東西,只是&feCallback。基本上看起來好像他們傳遞了一個變量而不是一個函數,如果這是有道理的話。

但是,當我嘗試這樣做時,出現Use of Undeclared identifier錯誤。是什麼賦予了?

FSEventStreamRef stream = FSEventStreamCreate(NULL, 
                &feCallback, // what does '&' mean? Why are no parameters passed? 
                &cntxt, 
                pathsToWatch, 
                kFSEventStreamEventIdSinceNow, 
                1, 
                kFSEventStreamCreateFlagWatchRoot); 

,再後來有回調函數:

static void feCallback(ConstFSEventStreamRef streamRef, 
         void* pClientCallBackInfo, 
         size_t numEvents, 
         void* pEventPaths, 
         const FSEventStreamEventFlags eventFlags[], 
         const FSEventStreamEventId eventIds[]) 
{ 
     NSLog(@"The file changed!"); 
} 

我喜歡一些示例代碼在這裏得到開源輔助對象的工作:https://bitbucket.org/boredzo/fs-notifier/overview

但同樣的事情。它具有方法:

- (id) initWithCallback:(FSEventStreamCallback)newCallback path:(NSString *)newPath;

,我不能將它傳遞一個newCallback因爲上述錯誤的。

回答

2

當創建與FSEventStreamCreate事件時,他們似乎都通過回調項目就好了。沒有參數或任何東西,只是&feCallback

FSEventStreamRef stream = FSEventStreamCreate(NULL, 
               &feCallback, // what does '&' mean? Why are no parameters passed? 

&是算子「的地址」,並計算結果爲指向其操作數。這裏並不是真的有必要。不在函數調用中的函數名稱始終計算爲指向函數的指針,有或沒有&

因此,它將指針傳遞給feCallback函數,這是FSEventStream對象將如何回調它的方式。

基本上看起來好像他們傳遞的是變量而不是函數,如果這樣做有道理的話。

這確實有道理,但不,這是不正確的。他們正在傳遞函數本身。

可以聲明一個包含指向函數的指針的變量。如果feCallback是這樣一個變量,那麼feCallback&feCallback意味着不同的事情:feCallback將是指向該函數的指針(在feCallback變量內),而&feCallback將是指向該變量的指針。

在你的情況下,雖然feCallback是一個函數,但這兩個表達式是等價的;以任何方式傳遞函數指針。

但是,當我嘗試去使用未聲明的標識符錯誤時,是什麼賦予了?

您還沒有聲明該標識符(在本例中是該函數)。

,再後來有回調函數:

這就是問題所在。您在使用名稱後定義了回調函數,但是您沒有在之前使用其名稱聲明函數。您必須先聲明該功能,然後才能使用它(或將它傳遞到任何地方)。

原因是因爲編譯器不知道「feCallback」是什麼,直到您告訴它,這是聲明的作用。當您在聲明或定義它之前嘗試引用「feCallback」時,編譯器不知道您在說什麼。

另一種方法是將函數的定義向上移動。定義被視爲對其後的所有內容的聲明。儘管如此,我會把它定義在原來的位置,然後在文件頂部附近添加一個聲明。

無論採用哪種方式,編譯器都會知道feCallback是什麼時候將其傳遞給FSEventStreamCreate

+0

呵呵。我從來沒有想到,簡單地重新排序實際功能會使這項工作成爲可能。我認爲我需要以某種方式「創建」這個功能,我顯然遇到了麻煩。如果你在'FSEventStreamCreate'的方法上面寫了'static void feCallback'位,那麼一切正常。猜猜這是一個來自Java/C#背景(所有這些都是自動完成的)的地方,對於Obj-C來說有點痛苦。 :) 謝謝您的幫助。 – cksubs