2011-08-18 47 views
0

我需要對Objective-C應用程序進行一些維護(將其更新爲使用新的API),並且以前從未使用該語言,但我有點困惑。瞭解Objective-C++ __block修飾符

我有一個Objective-C++類,它實現了API的一個接口,並在一個塊內使用,但是無論何時在塊內訪問,它都會因訪問衝突錯誤(EXC_BAD_ACCESS)而失敗。

進一步的調查顯示沒有任何對象的構造函數被調用。它在包含範圍內聲明,並使用__block修飾符。

要嘗試理解這一點,我做了一個快速應用從無到有,發現同樣的事情發生有:

class Foo 
{ 
public: 
    Foo() : value(1) { printf("constructor"); } 
    void addOne() { ++value; printf("value is %d", value); } 
private: 
    int value; 
}; 

void Bar() 
{ 
    Foo foo1; // prints "constructor" 
    __block Foo foo2; // doesn't print anything 

    foo1.addOne(); //prints "2" 
    foo2.addOne(); //prints "1" 
} 

任何人都可以解釋這裏發生了什麼?爲什麼不調用我的默認構造函數,以及如果沒有正確構造對象,如何訪問該對象?

回答

1

據我所知,你的例子中沒有使用塊,而是聲明foo2被塊使用。

這對foo2的處理有趣的事情,你可以閱讀更多關於here

希望有所幫助。

+0

我試圖將這個例子削減到最低限度,試圖弄清楚發生了什麼 - 真正的東西正在塊中使用。我已經看過那篇文章,但這並沒有真正解釋它。我可以看到變量生活在一個特殊的地方,並以奇怪的方式處理,但當然它仍然需要構建? –

0

偶然發現了這個老問題。這是一個長期以來修復的錯誤。現在__block正確構造C++對象。如果在塊中引用並且塊被複制,則堆副本將從原始移動構建,或者如果它不能移動構建,則複製構建。