Len si všimol __block
kľúčové slovo v niektorom z objektových kódov typu c:
// myString passed into the method
__block NSString *_myString = myString;
Ako to funguje? __block
kľúčové slovo zmeniť správanie vyššie uvedeného kódu?
odpovede:
6 pre odpoveď č. 1Tento variabilný modifikátor dáva možnosť meniť premennú v rozsahu bloku.
0 pre odpoveď č. 2
S výhradou výrazu nad modifikátorom __block sa nič nepodarí.V kontexte bloku však __block umožňuje blokom definovaným v tejto metóde mutovať premennú.
__block NSString *myString = @"My string";
NSLog(@"myString: %@", myString);
dispatch_async(dispatch_get_main_queue(), ^{
myString = @"My string changed.";
});
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"myString: %@", myString);
});
V tomto príklade môžu bloky zmeniť myStringukazovať na novú premennú. Je to analógové pre prenesenie premennej odkazom.Ak odstránim __block modifikátor z deklarácie myString by som si kompiláciu uvádzať, "Variable nie je priraditeľné (chýba __block typ špecifikátor).
0 pre odpoveď č. 3
Umožňuje niekoľko vecí:
- Umožňuje priradiť premennú vnútri bloku, ktorý ju zachytí.
- Umožňuje bloku vidieť zmeny hodnoty premennej po vytvorení bloku.
- Podľa MRC, a
__block
premenná typu ukazovateľa objektu nie je blokom zachovaná pri kopírovaní bloku.