我熟悉__block
語句,它使塊中的變量'可分配'。 但是我看到,當使用一些Objective-C功能使用塊作爲方法中的參數時,即使它們沒有用此__block
語句聲明,也可以分配一些變量。iOS >>塊>>更改塊外部變量的值
下面是實施例2級的代碼:
[UIView animateWithDuration:2 animations:^
{
self.animatedView.backgroundColor = [UIColor blueColor];
self.animatedView.center = CGPointMake(100, 100);
}];
(animatedView是一個IBOutlet連接的簡單的UIView)。
int myInt = 10;
NSMutableString* mString = [NSMutableString stringWithString:@"Mutable Hello"];
NSString* imString = @"Imutable Hello";
void (^myBlock)(void) =^
{
[mString appendString:@" Block"]; //working
imString = @"Imutable Hello Block"; //error
myInt = 11; //error
};
我的問題是:爲什麼我可以將值分配給UIView的實例屬性?
我沒有解決一個對象並改變它,就像我的mString。
我期望'中心'屬性的行爲就像我的myInt一樣,因爲它是直接訪問的C結構,而不是指向對象的指針。
我期望'backgroundColor'的行爲就像我的imString一樣,因爲它是一個指向一個新對象的對象的指針,不是嗎?
我無法在文檔中找到令人滿意的解釋......如果有人能提供一個,或者將我定位到一個,我將不勝感激。
讓「BOOL隱藏」的事實或「CGPoint中心」追究他們背後的ivars不會有什麼區別?這是否意味着它們是屬性(通過Setter方法訪問)會改變它們在內存中的分配方式?我也嘗試過在我的課堂上聲明的伊娃(而不是方法中的局部變量),它也起作用 - 而且它沒有通過任何方法。 –
該方法是一個副作用(爲了更好的術語)。區別在於內存位置。局部變量在堆棧上創建,所以除非您告訴編譯器將它們複製到堆中,否則它們不可訪問。編譯器在塊內部提供數據時也使用了一些'技巧'(並且所採用的路由在指針和原語之間是不同的)。這是一個深入的主題,請閱讀此主題:http://stackoverflow.com/questions/15082265/why-is-a-block-variable-is-moved-to-the-heap-before-the-塊被複制 – Wain
明白了。 Wain,你是男人!謝謝。 –