Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«iOS. ΠŸΡ€ΠΈΠ΅ΠΌΡ‹ программирования». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 68

Автор Π’Π°Π½Π΄Π°Π΄ Нахавандипур

NSMutableArray *array = [[NSMutableArray alloc]

initWithObjects:@"obj1",

@"obj2", nil];


[array sortUsingComparator: ^NSComparisonResult(id obj1, id obj2) {


NSLog(@"self = %@", self);


/* Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для Π±Π»ΠΎΠΊΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. */

return NSOrderedSame;


}];


}


НС внСся ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ вашСго Π±Π»ΠΎΠΊΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π²Ρ‹ Π½Π΅ смоТСтС ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ self Π² нСзависимом Π±Π»ΠΎΠΊΠΎΠ²ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅. ΠŸΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции:


void (^incorrectBlockObject)(void) = ^{

NSLog(@"self = %@", self); /* self здСсь Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½. */

};

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ self Π² нСзависимом Π±Π»ΠΎΠΊΠΎΠ²ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅, просто ΠΏΠ΅Ρ€Π΅Π΄Π°ΠΉΡ‚Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, прСдставляСмый self, Π²Π°ΡˆΠ΅ΠΌΡƒ Π±Π»ΠΎΠΊΠΎΠ²ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°:

void (^correctBlockObject)(id) = ^(id self){


NSLog(@"self = %@", self);


};


β€” (void) callCorrectBlockObject{


correctBlockObject(self);


}

Π­Ρ‚ΠΎΠΌΡƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ имя self. Π•ΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°Ρ‚ΡŒ любоС имя. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Ссли Π½Π°Π·Π²Π°Ρ‚ΡŒ этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ self, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ просто ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π±Π»ΠΎΠΊΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΠΎΠ·ΠΆΠ΅ ΠΈ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π½Π° языкС Objective-C. НС придСтся ΠΌΠ΅Π½ΡΡ‚ΡŒ имя ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ экзСмпляра ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π½Π° self, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠ΄ Π±Ρ‹Π» воспринят компилятором.

Рассмотрим ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ свойства ΠΈ посмотрим, ΠΊΠ°ΠΊ Π±Π»ΠΎΠΊΠΎΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΊ Π½ΠΈΠΌ доступ. ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ со встраиваСмыми Π±Π»ΠΎΠΊΠΎΠ²Ρ‹ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‚ΠΎΡ‡Π΅Ρ‡Π½ΡƒΡŽ Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ β€” ΠΎΠ½Π° позволяСт ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈΠ· ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Ρ… свойств self ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π² Π½ΠΈΡ… Π΄Π°Π½Π½Ρ‹Π΅. Допустим, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎ Ρƒ нас Π² классС Π΅ΡΡ‚ΡŒ объявлСнноС свойство Ρ‚ΠΈΠΏΠ° NSString, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ называСтся stringProperty:


#import Β«AppDelegate.hΒ»


@interface AppDelegate()

@property (nonatomic, copy) NSString *stringProperty;

@end


@implementation AppDelegate


Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅ составляСт Ρ‚Ρ€ΡƒΠ΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ этому свойству Π²ΠΎ встраиваСмом Π±Π»ΠΎΠΊΠΎΠ²ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅:


β€” (void) simpleMethod{


NSMutableArray *array = [[NSMutableArray alloc]

initWithObjects:@"obj1",

@"obj2", nil];


[array sortUsingComparator: ^NSComparisonResult(id obj1, id obj2) {


NSLog(@"self = %@", self);


self.stringProperty = @"Block Objects";


NSLog(@"String property = %@", self.stringProperty);


/* Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для Π±Π»ΠΎΠΊΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. */

return NSOrderedSame;


}];


}


Но Π² нСзависимом Π±Π»ΠΎΠΊΠΎΠ²ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡Π΅Ρ‡Π½ΡƒΡŽ Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ для считывания объявлСнного свойства ΠΈΠ»ΠΈ записи ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² это свойство:


void (^correctBlockObject)(id) = ^(id self){


NSLog(@"self = %@", self);


/* Π’мСсто этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄-установщик */

self.stringProperty = @"Block Objects"; /* ΠžΡˆΠΈΠ±ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции */


/* Π’мСсто этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄-ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»ΡŒ. */

NSLog(@"self.stringProperty = %@",

self.stringProperty); /* ΠžΡˆΠΈΠ±ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции */


};


Π’ Π΄Π°Π½Π½ΠΎΠΌ сцСнарии Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ-установщиком ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ-ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»Π΅ΠΌ синтСзированного свойства:


void (^correctBlockObject)(id) = ^(id self){


NSLog(@"self = %@", self);


/* Π­Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ. */

[self setStringProperty:@"Block Objects"];


/* Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ. */

NSLog(@"self.stringProperty = %@",

[self stringProperty]);


};


Когда Π΄Π΅Π»ΠΎ касаСтся встраиваСмых Π±Π»ΠΎΠΊΠΎΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ лишь ΠΎΠ΄Π½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ: встраиваСмыС Π±Π»ΠΎΠΊΠΎΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ значСния для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² своСй лСксичСской области видимости. Если Π²Ρ‹ Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ это Π·Π½Π°Ρ‡ΠΈΡ‚, β€” Π½Π΅ Π²ΠΎΠ»Π½ΡƒΠΉΡ‚Π΅ΡΡŒ. Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€:


typedef void (^BlockWithNoParams)(void);


β€” (void) scopeTest{


NSUInteger integerValue = 10;


BlockWithNoParams myBlock = ^{

NSLog(@"Integer value inside the block = %lu",

(unsigned long)integerValue);

};


integerValue = 20;


/* Π’Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π±Π»ΠΎΠΊ здСсь послС измСнСния

значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ integerValue. */

myBlock();


NSLog(@"Integer value outside the block = %lu",

(unsigned long)integerValue);


}


ΠœΡ‹ опрСдСляСм Ρ†Π΅Π»ΠΎΡ‡ΠΈΡΠ»Π΅Π½Π½ΡƒΡŽ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΈ сначала присваиваСм Π΅ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 10. Π—Π°Ρ‚Π΅ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ Π±Π»ΠΎΠΊΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½ΠΎ ΠΏΠΎΠΊΠ° Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π΅Π³ΠΎ. ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π±Π»ΠΎΠΊΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½, ΠΌΡ‹ просто измСняСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ локальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π·Π°Ρ‚Π΅ΠΌ (послС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΌΡ‹ Π΅Π³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π΅ΠΌ) попытаСтся ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Π‘Ρ€Π°Π·Ρƒ послС измСнСния значСния локальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π½Π° 20 Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π±Π»ΠΎΠΊΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Π›ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π±Π»ΠΎΠΊΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π½Π° консоль Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 20, Π½ΠΎ этого Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚. Он Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 10, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ здСсь:


Integer value inside the block = 10

Integer value outside the block = 20


Π’ΠΎΡ‚ Ρ‡Ρ‚ΠΎ здСсь происходит. Π‘Π»ΠΎΠΊΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ сохраняСт для сСбя копию ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ integerValue, Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΡƒΡŽ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния, ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ это ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΌ, Π³Π΄Π΅ рСализуСтся Π±Π»ΠΎΠΊ. ΠΠ°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ вопрос: ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΆΠ΅ Π±Π»ΠΎΠΊΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ доступноС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ integerValue? ΠžΡ‚Π²Π΅Ρ‚ прост, ΠΈ ΠΌΡ‹ ΡƒΠΆΠ΅ Π΄Π°Π»ΠΈ Π΅Π³ΠΎ Π² этом Ρ€Π°Π·Π΄Π΅Π»Π΅. Если Ρƒ локальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π½Π΅Ρ‚ прСфикса __block, ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰Π΅Π³ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚ΠΈΠΏ хранСния, Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² лСксичСской области видимости Π±Π»ΠΎΠΊΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° просто ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π±Π»ΠΎΠΊΠΎΠ²ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, доступныС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ это ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° scopeTest ΠΈ ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ integerValue прСфиксом __block, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌ Ρ‚ΠΈΠΏ хранСния. Π­Ρ‚ΠΎ дСлаСтся Ρ‚Π°ΠΊ:


β€” (void) scopeTest{


__block NSUInteger integerValue = 10;


BlockWithNoParams myBlock = ^{

NSLog(@"Integer value inside the block = %lu",

(unsigned long)integerValue);

};


integerValue = 20;


/* Π’Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π±Π»ΠΎΠΊ здСсь послС измСнСния

значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ integerValue. */

myBlock();


NSLog(@"Integer value outside the block = %lu",

(unsigned long)integerValue);


}


Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Ссли вывСсти Π½Π° консоль Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ послС Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° scopeTest, ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:


Integer value inside the block = 20

Integer value outside the block = 20


Π˜Ρ‚Π°ΠΊ, Π² Π΄Π°Π½Π½ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ довольно ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ рассмотрСли вопросы использования ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… с Π±Π»ΠΎΠΊΠΎΠ²Ρ‹ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ. Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ Π²Π°ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ нСсколько Π±Π»ΠΎΠΊΠΎΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Π½ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°ΠΉΡ‚Π΅ ΠΈΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, считывайтС ΠΈΠ· Π½ΠΈΡ… ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ Π² Π±Π»ΠΎΠΊΠΎΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ… ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ этот Ρ€Π°Π·Π΄Π΅Π», Ссли случайно Π·Π°Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°, Ρ€Π΅Π³ΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Π² Π±Π»ΠΎΠΊΠΎΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ….

7.3. Π’Ρ‹Π·ΠΎΠ² Π±Π»ΠΎΠΊΠΎΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

ΠŸΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π΄Π°Ρ‡ΠΈ

Π’Ρ‹ Π½Π°ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΎΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Π° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ трСбуСтся ΠΈΡ… ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹.

РСшСниС

Π˜ΡΠΏΠΎΠ»Π½ΡΠΉΡ‚Π΅ ваши Π±Π»ΠΎΠΊΠΎΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π° языкС C. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎΠ± этом β€” Π² ΠΏΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π»Π΅ Β«ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅Β».

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

Π’ Ρ€Π°Π·Π΄Π΅Π»Π°Ρ… 7.1 ΠΈ 7.2 Π²Ρ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π²Ρ‹Π·ΠΎΠ²Π° Π±Π»ΠΎΠΊΠΎΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Π’ Π΄Π°Π½Π½ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ приводятся Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹.

Если Ρƒ вас Π΅ΡΡ‚ΡŒ нСзависимый Π±Π»ΠΎΠΊΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΈ Π±Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π½Π° языкС C:


void (^simpleBlock)(NSString *) = ^(NSString *paramString){

/* Π Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ Π±Π»ΠΎΠΊΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ paramString. */

};


β€” (void) callSimpleBlock{

simpleBlock(@"O'Reilly");


}


Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ нСзависимый Π±Π»ΠΎΠΊΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ нСзависимого Π±Π»ΠΎΠΊΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, дСйствуйтС Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π½Π° языкС C:


NSString *(^trimString)(NSString *) = ^(NSString *inputString){


NSString *result = [inputString stringByTrimmingCharactersInSet:

[NSCharacterSet whitespaceCharacterSet]];

return result;


};


NSString *(^trimWithOtherBlock)(NSString *) = ^(NSString *inputString){

return trimString(inputString);

};


β€” (void) callTrimBlock{


NSString *trimmedString = trimWithOtherBlock(@" O'Reilly ");

NSLog(@"Trimmed string = %@", trimmedString);


}


ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ callTrimBlock Π½Π° языкС Objective-C: