ãã«ãã¹ã¬ããããã°ã©ãã³ã°ã¿ã¹ã¯ã解決ã§ããããã°ã©ãã¯ããã5ïŒ ã§ããããšãç¥ãããŠããŸãã ãããŠåãå Žæã§ãã³ã¢ã®æ°ã®å¢å ã«äŒŽããã¢ãã€ã«ããã€ã¹ã§ãã£ãŠããè€æ°ã®ã¹ã¬ããã䜿çšããå¿ èŠæ§ãäœåºŠãå¢å ããŸãã æ¯æ¥ã䞊åããã°ã©ãã³ã°ã®ç¹å®ã®åé¡ã解決ããããã«ç¹å¥ã«èšèšãããæ°ããããã°ã©ãã³ã°èšèªãç»å ŽããŸãããã§ã«ããç¥ãããåºã䜿çšãããŠããæ¹æ³ã¯ãç解ãä¿é²ããã ãã§ãªããããã°ã©ã ã³ãŒãã®è©©ã®è§£æ±ºçãæžããæ¹æ³ãç»å ŽããŸãã
ã¢ã³ãã£ã»ãªã©ã ãšã°ã¬ãã°ã»ãŠã£ã«ãœã³ãç·šéãããçæ³ã®ã³ãŒãããšããæ¬ãèªãã§ã䞊ååŠçã®ç« ã§èå³æ·±ãä»äºã«åºãããæ©äŒããããŸããïŒ24. pã444ïŒã ãã®äžã§ãèè ã®Simon Peyton Jonesã¯Haskellã®è§£æ±ºçãåŒçšããŠããŸãã 圌ã¯ãŸããAda95ããã³Polyphonic CïŒèšèªã®Sat Klausåé¡ã«ã¯è§£æ±ºçããããšäž»åŒµããŠããŸãã ç§ã®å°éçãªèå³ã®ãããååãšObjective-Cèšèªçšã®ãã«ãã¹ã¬ããAppleå®è£ ã®å¯èœæ§ã«ã€ããŠå°ãæ©ãè°è«ããªããã°ãªããŸããã§ããã
ããã°ã©ãã³ã°ã¯ãèšèªãã§ã¯ãªãæœè±¡åã®ã¬ãã«ã§å¿ èŠã§ãããšèããããŠããŸãããåãæåãåãããšãèšèªã§è¡šçŸãããé³ç¯ã®æµã¿ã§ã¯ãªããææ ã®è©©ã®çŸãããæ¢ãããšãã§ããŸãã ã«ããã®äžã§ãç§ã¯èšèªè¡šçŸåã空ã®ãã¬ãŒãºã§ã¯ãªããæ³ååãåºæ¿ããã¡ããã£ãŒã®ããã®æãç§ãšäžç·ã«æãããšãææ¡ããŸãã
åé¡æïŒ
ããµã³ã¿ã¯ãæŸç§ããæ»ã£ã9人ã®ããã«ã€å šå¡ããŸãã¯9人ããããªã3ã€ã®ãšã«ãã®ã°ã«ãŒãã«ãã£ãŠç®èŠãããŸã§ãå®æçã«ç ããŸãã 鹿ã圌ãèµ·ãããå Žåã圌ã¯ãããã®ãããããããã«å©çšããããã¡ããå±ãããããŠæåŸã«ããããå©çšããŸãïŒç¡ææŸç§ã®ããã«ããããæŸããŸãïŒã ãšã«ããç®ãèŠãŸããšã圌ã¯åã°ã«ãŒãããªãã£ã¹ã«æ¡å ããæ°ããããã¡ãã®éçºã«ã€ããŠçžè«ããæåŸã«ãªãã£ã¹ããé£ãåºããŸãïŒä»äºã«æ»ãæ©äŒãäžããŸãïŒã ãšã«ãã®ã°ã«ãŒããšé¹¿ã®ã°ã«ãŒãããµã³ã¿ã¯ããŒã¹ãåæã«åŸ ã€å Žåã圌ã¯é¹¿ãåªå ããŸãã ïŒCïŒ
ãšã³ããªãŒïŒ
ããã¯ãèšèªã®æ©èœãæ£ç¢ºã«ç€ºãçæ³çãªã¿ã¹ã¯ã®ããã«æããŸããã ãã€ãŠãç§ã¯CïŒã§å€ãã®ãã«ãã¹ã¬ããããã°ã©ãã³ã°ãè¡ã£ãŠããŸãããããã®ç®çã«é©ããèšèªã¯ãªããšèããŠããŸããã CïŒã¯ããã®ã·ã³ãã«ããšå¹çæ§ãåããŠããŸãã ããããAppleã¯ãã®ããã»ã¹ãæã«å€ããŸããã ãããŠãåæ²ã§ã©ã®ããã«ãã®ãªãºã ããã®ã¡ãŒã¿ãŒãæããå¿ èŠãããããããã¯ããªããèãé³æ¥œããåã³ãäžããã§ãããã æåã«ãæ¬åŒ§ã®å±±ã«å¯ŸåŠããããšã¯ãå¿èåãšæ³šæåãçºéããŠãã人ã ã®ããã«èšèšããããéèŠãªäœæ¥ã§ãã
ã¿ã¹ã¯ã«ã€ããŠè°è«ãããšããšã«ããšé¹¿ã®éã«å€§ããªéãã¯ãªããšããçµè«ã«éããã®ã¯ç°¡åã§ãã ç§ãã¡ã®å£°æã§ã¯ããããã®çç©åŠç圢æ ã®äž¡æ¹ã¯ãå€éšããã»ãšãã©ç解ãããŠããªãäœããã®è¡åãå®è¡ã§ããæœè±¡çãªäººãšåäžèŠããããšãã§ããŸãã æŠããŠããããã©ã®ãããªã¢ã¯ã·ã§ã³ã§ãããã¯éèŠã§ã¯ãããŸããããåææ¡ä»¶ã«åºã¥ããŠãã·ã«ãæŸç§ããããšã«ããæ©èœããŸãã ãããŠãããã圌ãã®å人çãªè¡åãå®äºããã«ã¯æéãããããŸãã ããã«ãåå人ã¯è¡åã®ããã«ãã®è²ŽéãªãªãœãŒã¹ã®åã ã®éãè²»ãããŸãã
ãã¹ãŠã®ã³ãŒãã¯ãXcode 4.3ã®ARCã䜿çšããŠèšè¿°ãããŠããŸãã Xcode 4.3以éã§ã¯ããã®æ¹è¯ãå¿ èŠã§ãã ã¡ãœããã®äœ¿çšåŸã«èª¬æãããŠããŠããã¡ãœãããèŠãããšãã§ããããã«ãªããŸããããŸããARCã䜿çšãããšããªããžã§ã¯ãã®ç Žå£ãç¹å¥ãªã¡ã¢ãªãã£ã¹ãããã«ã€ããŠå¿é ããå¿ èŠããªããªããŸãã ã€ãŸã ãªããžã§ã¯ãã¯è§£æŸããå¿ èŠããªãã ãã§ãªããã³ã³ãã€ã©ã«ãã£ãŠåã«çŠæ¢ãããŠããŸãã ã³ãŒãã®éææ§ãå®è¡é床ããããŠãã¡ããããããã°ã«è²»ããããæéã«ãããŠãã²ã€ã³ã¯éèŠã§ãã
ãŸãã察å¿ããã€ã³ã¿ãŒãã§ã€ã¹ã«ã€ããŠèª¬æããŸãã
@interface Persone : NSObject { NSInteger number; } @property (nonatomic, copy) NSString *name; // . - (Persone *)execution; @end #import "Common.h" @interface Elf : Persone @end #import "Common.h" @interface Deer : Persone @end
èŠãŠã®éãã ãã¹ãŠãéåžžã«åçŽã§ãããè¿œå ã®è³ªåãããããšã¯ãããŸããã
ãµã³ã¿ã®ã€ã³ã¿ãŒãã§ãŒã¹ã¯ãã£ãšé¢çœãã§ãã
#import "Common.h" @interface Santa : Persone @property (nonatomic) BOOL isBusy; // ? \ . - (Persone *)wakeUp:(NSArray *)group; //. , . . . ! @end
åé¡ã®ç¶æ ã«ãã£ãŠã2çš®é¡ã®ã°ã«ãŒãã®ããããããµã³ã¿ãèµ·ããããšãã§ããŸãã ããããé©ãããããããããŸããã ããšãã°ããµã³ã¿ã¯ã°ã«ãŒããéãŸã£ãç¬éã«ç ããªãããšãããããããã£ãŠããã¹ãéªéãããå¯èœæ§ããããã©ããã®ç解ãå¿ èŠã§ãã
åã€ã³ã¿ãŒãã§ã€ã¹ã«ã¯ãå°æãåŒãèµ·ããå¯èœæ§ã®ããç¥ç§çãªãã¡ã€ã«ããããŸãã
#importâ Common.hâããããããã¯ãã¹ãŠç°¡åã§ã-ããã°ã©ã ã§äœ¿çšãããå®æ°ã®æå³ãšããã®ä»ã®ããããŒãã¡ã€ã«ã«ã€ããŠèª¬æããŠããŸãã
#import "Persone.h" #import "Deer.h" #import "Elf.h" #import "Santa.h" #import "Groups.h" #define kAllMessages 1 // , . #define kGroupDeers @"Deer" // . #define kGroupElfs @"Elf" // . #define kMontsDeer 12 // 1-12. #define kMontsElf 18 // . 1-18. #define kMontsSanta 4 // . #define countElfInGroup 3 // , . #define countDeerInGroup 9 // , .
ã°ã«ãŒãå ã®åãã¿ã€ãã®å人ã®æ å ±ã察象ãšããæåŸã®éèŠãªã€ã³ã¿ãŒãã§ãŒã¹ãæ®ã£ãŠããŸãã
#import "Common.h" @interface Groups : NSObject { NSMutableDictionary *groups; // . } - (Groups *)add:(Persone *)persone; // . - (NSArray *)ready; // . @end
å®è£ ïŒ
åé¡ã解決ããã«ã¯ãã°ã«ãŒãã圢æããããã®ãã£ã1ã€ã®ãµã³ã¿ããã£ã1ã€ã®ã¡ã«ããºã ãããã³ä»»æã®æ°ã®é¹¿ãšãšã«ãã®æšæ¬ãå¿ èŠã§ããããšã¯æããã§ãã
ç°¡åãªããšããå§ããŸããã...æåã«ã鹿ãäœæããŸãã
#import "Common.h" @implementation Deer static int count; @synthesize name; - (id)init { if(count >=9) return nil; // 9. self = [super init]; if (self) { count++; number = count; self.name = kGroupDeers; } return self; }
åæååã¯éåžžã«ã¹ãã¬ãªã¿ã€ãåãããŠããã説æã¯äžèŠã§ãã ã¹ãŒããŒã¯ã©ã¹ã«ã¯ãèŸæžã®ããŒå€ãå«ãå€æ°ã®åœ¢åŒã§ãåŸã§äœ¿çšããnameããããã£ããããŸãã
- (void)eat { dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSInteger month = (arc4random() % kMontsDeer) + 1; #if kAllMessages NSLog(@"%d- %d ", number, month); #endif [NSThread sleepForTimeInterval:month]; #if kAllMessages NSLog(@"%d- ", number); #endif dispatch_async(dispatch_get_main_queue(), ^{ [[[Groups alloc] init] add:self]; }); }); }
ãããŠãããã¯ãã£ãšé¢çœãã§ãã eatã¡ãœããã¯ãDeerã®çŸåšã®ã€ã³ã¹ã¿ã³ã¹ã«å¯ŸããŠåå¥ã®å®è¡ã¹ã¬ãããéå§ããŸãã ã€ãŸããããããã®é¹¿ããããŠå°æ¥ããšã«ãã¯ãå¥ã ã®å°å·ã§ç§ãã¡ãšäžç·ã«æ®ãããŸãã è€éãªãã©ã±ããæ§é ã«ãããããããå®éã«ã¯ããã¹ãŠãéåžžã«åçŽã§ãïŒdispatch_asyncïŒdispatch_get_global_queueïŒ0ã0ïŒã^ {}ïŒ; -æ¬åŒ§å ã«èšè¿°ãããŠãããã®ãå®è¡ãã¥ãŒã«å ¥ããŸãã dispatch_get_global_queueåŒæ°ã¯ã°ããŒãã«ãã¥ãŒãæå³ããŸãã ïŒ0ã0ïŒ-æåã®0ã¯åªå 床ã瀺ããŸããããã©ã«ãã§ã¯æšæºã§ãã2çªç®ã®0ã¯iOS SDKã®äœãæå³ãããæè¡ã®ãããªãéçºã®ããã«äºçŽãããŠããŸãã
èšè¿°ããããããã¯å ã§ãNSInteger month =ïŒarc4randomïŒïŒïŒ kMontsDeerïŒ+ 1;ãèŠã€ããŸãã -鹿ã®æŸç§ã®ææ°ãã©ã³ãã ã«åãåããŸãã ãã®åŒã§ååŸãããæŽæ°ã®ç¯å²ã¯ã1ãkMontsDeerã§ãã ããã«ç¶ããŠãããã»ã¹ã®å®è¡ãé ããŸã-ç§èå°ã®äžçš®ã®ãšãã¥ã¬ãŒã·ã§ã³-[NSThread sleepForTimeIntervalïŒmonth]; ãããŠããã®ã¡ãœãããå®äºããåæ§ã®ãã¥ãŒã«è¿œå ããŸããããã§ã«ããã€ãã®ã³ãŒãã®ã¡ã€ã³ã¹ã¬ããã«è¿œå ããŸãã ãã®ã³ãŒãã¯å¥ã®ãã¥ãŒãè¡šããŠããŸãããçŸåšã®ããã°ã©ã ã®ã¬ãã«ã§æ¢ã«äœæãããŠããŸãã èŠããŠããããã«ãã°ã«ãŒããããŒãžã£ãŒã«ã¯ãã¢ããªã±ãŒã·ã§ã³å šäœã«å¯ŸããŠ1ã€ã ããå¿ èŠã§ãã èšãæããã°ã圌ã¯ã·ã³ã°ã«ãã³ã§ãã ãããã£ãŠãã€ãã·ã£ã©ã€ã¶ãŒãä»ããŠã€ã³ã¹ã¿ã³ã¹ãäœæãããšãå®éã«ã¯ã以åã«èª°ããäœæããå Žåãæ¢åã®ã€ã³ã¹ã¿ã³ã¹ãè¿ãããŸãã addã¡ãœããã¯ãçŸåšã®é¹¿ãåä¿¡ãã¥ãŒã«è¿œå ããã ãã§ãã
- (Persone *)execution { [self eat]; return self; } @end
åŸè ã®æ¹æ³ã¯ãåºç€ãšãªãã€ã³ã¿ãŒãã§ã€ã¹ã®äžè²«æ§ãä¿èšŒããã ãã§ãã ã€ãŸã ãã³ãã¬ãŒãå®è¡ã¡ãœãããäœæããŸãã
åæ§ã«ããšã«ãã®ã¯ã©ã¹ãäœæããŸãã
#import "Common.h" @implementation Elf static int count; @synthesize name; - (id)init { if(count >=10) return nil; // 10. self = [super init]; if (self) { count++; number = count; self.name = kGroupElfs; } return self; } - (void)work { dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSInteger month = (arc4random() % kMontsElf) + 1; #if kAllMessages NSLog(@" %d . %d ", number, month); #endif [NSThread sleepForTimeInterval:month]; #if kAllMessages NSLog(@" %d ", number); #endif dispatch_async(dispatch_get_main_queue(), ^{ [[[Groups alloc] init] add:self]; }); }); } - (Persone *)execution { [self work]; return self; } @end
åããŠæããã
Groupã¯ã©ã¹ã®ã¿ã¹ã¯ã¯ãã°ã«ãŒãããã£ã¹ãããããã³åœ¢æããããšã§ãã ã¡ã«ããºã ã¯éåžžã«åçŽã§ãã å人ã¯èªåã®ã¿ã€ãã®ãã¥ãŒïŒã€ãŸãããšã«ããããšã«ãã鹿ãã鹿ïŒã«å ¥ããããå¿ èŠãªæ°ã®ã³ããŒããã¥ãŒã«éãããããšãããããåé€ããã圌ãã®ããã«ç¹å¥ã«èšèšããããããã¡ã«çœ®ãããŸã-ãµã³ã¿ã®åŸ å宀-ã¯ã©ãŠã¹ã
#import "Common.h" @implementation Groups static Groups *instance; - (id)init { if(instance!=nil) return instance; self = [super init]; if (self) { groups = [NSMutableDictionary dictionary]; instance = self; } return self; } - (Groups *)add:(Persone *)persone { NSMutableArray *queue = [groups objectForKey:persone.name]; // . if(queue == nil) queue = [NSMutableArray array]; [queue addObject:persone]; // . [groups setValue:queue forKey:persone.name]; #if kAllMessages NSLog(@" \"%@\" %d", persone.name, queue.count); #endif Santa *santa = [[Santa alloc] init]; if(santa.isBusy == NO) [santa wakeUp:[self ready]]; return self; } - (NSArray *)queueElf { NSMutableArray *queue = [groups objectForKey:kGroupElfs]; if(queue.count < countElfInGroup) return nil; // . NSMutableArray *group = [NSMutableArray array]; for (int i=0; i<countElfInGroup; i++) // 3 ... [group addObject:[queue objectAtIndex:i]]; for (id item in group) // ... . [queue removeObject:item]; [groups setValue:queue forKey:kGroupElfs]; return [group copy]; } - (NSArray *)queueDeer { NSMutableArray *queue = [groups objectForKey:kGroupDeers]; if(queue.count < countDeerInGroup) return nil; // . NSArray *group = [queue copy]; for (id item in group) // . [queue removeObject:item]; [groups setValue:queue forKey:kGroupDeers]; return group; } - (NSArray *)ready { NSArray *group = [self queueElf]; if(group!=nil) return group; return [self queueDeer]; }
åè¿°ã®ããã«ããã®ã¯ã©ã¹ã¯ã·ã³ã°ã«ãã³ã§ãã ARCã䜿çšããŠèšè¿°ãããŠããããããã®äœæã¯éåžžã«ç°¡åã«æããŸãã ãã®ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã¯ã¡ã€ã³ã¹ã¬ããå ã§ã®ã¿äœ¿çšãããããšãåæãšããŠããŸãã ããã«ãããç°ãªãã¹ã¬ãããããã¥ãŒãå®è£ ããŠãããã£ã¯ã·ã§ããªã®åãã€ã³ã¹ã¿ã³ã¹ã«ã¢ã¯ã»ã¹ãããšãã®åé¡ãåé¿ãããŸãã ãã¡ãããããã«ããå®è¡æã®ãªãŒããŒããããçºçããŸãããç¡èŠã§ããã»ã©éèŠã§ã¯ãããŸããã
ãã®ã³ãŒãã®æãèå³æ·±ãå Žæã¯æ¬¡ã®ã»ã¯ã·ã§ã³ã§ãã
Santa *santa = [[Santa alloc] init]; if(santa.isBusy == NO) [santa wakeUp:[self ready]];
ã°ã«ãŒãã®ãã£ã¹ãããã£ã®ããã«ãç§ãã¡ã¯ãµã³ã¿ã®ã³ããŒãæã«å ¥ããããã«æ¥ãŠã圢æãããã°ã«ãŒãã圌ã®éšå±ã«è©°ã蟌ã¿ãŸãã ãšã«ãããäœã ãã®ãããããã¯é¹¿ãŸãã¯ãšã«ãã«ãªããã¡ãœããã¯çããŸã-ïŒNSArray *ïŒready
ç§ã®æãããããšã«ãç§ã¯èšäºã®æºåäžã«åé¡ã®æ¡ä»¶ãæ··ä¹±ãããããšã«æ°ä»ããŸããã ã€ãŸã ç§ã®å ŽåãCeteris paribusããµã³ã¿ã¯é¹¿ã§ã¯ãªããšã«ãã«ä»ããŠããŸãã ããã«ããšã«ãã®æ倧æ°ã¯9ã§ã¯ãªã10ã§ãããããã®ãšã©ãŒã¯äž¡æ¹ãšãç°¡åã«ä¿®æ£ã§ããŸãã ããšãã°ãã¡ãœããã¯æ¬¡ã®ããã«å€æŽãããŸãã
- (NSArray *)ready { NSArray *group = [self queueDeer]; if(group!=nil) return group; return [self queueElf]; }
ãã ããå°æ¥çã«ã¯ãäœæ¥ãããã³ã«ã«é¢ããŠã¯ããã®ãããªä¿®æ£ãããæ¡ä»¶ãããã§æ³å®ãããŠããŸãã
ãããªã¬ã«
ãããŠãç§ãã¡ã¯æã®æåŸã®ãã£ã©ã¯ã¿ãŒã§ãããµã³ã¿ã«çããŸããã
#import "Common.h" @implementation Santa static Santa *santa; static int count; BOOL doWork; @synthesize isBusy; static int groupNumber; - (id)init { if(santa!=nil) return santa; self = [super init]; if (self) { santa = self; count++; number = count; NSLog(@">> %d- ", number); } return self; } - (void)sleep { NSLog(@">> %d ....", number); } - (Santa *)wakeUp:(NSArray *)group { if(group == nil) return self; NSLog(@">> %d .... ", number); [self work:group]; // . return self; } - (BOOL)isBusy { return doWork; } - (void)work:(NSArray *)group { if(doWork == YES) return; doWork = YES; __block Santa *santa = self; __block NSArray *currentGroup = group; __block NSInteger IDGroup = ++groupNumber; dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSInteger month = (arc4random() % kMontsSanta) + 1; NSLog(@">> %d- . %d c ID %d", number, month, IDGroup); [santa portalIn:currentGroup]; [NSThread sleepForTimeInterval:month]; NSLog(@">> %d c ID %d", number, IDGroup); dispatch_async(dispatch_get_main_queue(), ^{ doWork = NO; [[santa portalOut:currentGroup] sleep]; // . }); }); } - (Persone *)execution { NSLog(@"Yahoo!!!"); return self; } - (Santa *)portalIn:(NSArray *)group { if([[group objectAtIndex:0] isKindOfClass:[Elf class]]) NSLog(@">> %d ", number); if([[group objectAtIndex:0] isKindOfClass:[Deer class]]) NSLog(@"\n\t\t yp p\n\t\t p p y p.\n\t\t y, p p p,\n\t\t y p, p"); return self; } - (Santa *)portalOut:(NSArray *)group { for (Persone *persone in group) [persone execution]; return self; }
ã³ãŒãã®æãè€éãªéšåã«é²ãåã«ã2ã€ã®æ¹æ³ã«ã€ããŠç°¡åã«èª¬æããå¿ èŠããããŸãã
çé¢ãã¢æ¹åŒïŒ
portalIn:(NSArray *)group
ãã¢ã®åºå£æ¹æ³ïŒ portalOut:(NSArray *)group.
ããããªãã§ç°¡åã«è¡ãããšã¯å¯èœã§ããããããã¿ã¹ã¯ã®åææ¡ä»¶ã§ãã-å ¥ãå£ãšåºå£ã®ãã¢ã«éäžããããšã
å®è¡æ¹æ³ã¯ããã®ãµã³ã¿ã®ã€ã³ã¹ã¿ã³ã¹ã«ã¢ããŒã«ããããšãéç¥ããã ãã§ãã ãµã³ã¿ãæäœãããã³ã«ã圌ã®çªå·ã衚瀺ããŸãã èªè ã¯ãã¢ã¯ã·ã§ã³ã®å šæéãéããŠãã¹ãŠã®ã¢ã¯ã·ã§ã³ãåäžã®ãµã³ã¿ã§çºçãããšç¢ºä¿¡ããããã«ããããçç±ã§è¡ããŸãã
æ¹æ³
wakeUp:(NSArray *)group
ã°ã«ãŒããåŸ
å宀ã«å
¥ããŠãµã³ã¿ãèµ·ãããŸãã ãã¹ãŠã®äž»ãªããšã¯ãäœæ¥ã¡ãœããã§çºçããŸãã
æåã«ããµã³ã¿ãå¿ãããã©ããã確èªããŸãã
if(doWork == YES) return;
ããã¯åé·ãªãã§ãã¯ã§ãããåé€ã§ããŸãã ããããäœããããŸããããªãããã¯ã1ã€ã®ãŠã§ã€ã¯ãéãæ¹ãè¯ãã§ãã 次ã«ããå¿ããããµã€ã³ãå
¥ããŠãæ£é¢ãã¢ãããã¯ããŸãã doWork = YES;
次ã«ãã¹ã¬ãããããã¯ã°ã©ãŠã³ããããã³ã¡ã€ã³å ã§äœ¿çšããå€æ°ãæºåããå¿ èŠããããŸãã
__block Santa *santa = self; __block NSArray *currentGroup = group; __block NSInteger IDGroup = ++groupNumber;
ãããè¡ããªããšãéå ±æãªãœãŒã¹ãžã®ã¢ã¯ã»ã¹ãé€å€ãããå ŽåããããŸãã äžèšã®ç°¡åãªæäœã«ããããããçºçããªãããšãä¿èšŒãããŸãã ããã§ã__ blockããŒã¯ãŒãã¯äºéã¢ã³ããŒã¹ã³ã¢ã䜿çšããŠããããšã«æ³šæããŠãã ããã ã€ãŸã _æåã¯2å䜿çšãããŸãïŒ æ¬¡ã«ãDeersãšElvesã§è¡ã£ãããã«ãSantaã«å¥ã®ã¹ããªãŒã ãäœæããå ¥ãå£ã®ãã¢ã¡ãœããã䜿çšããŠSantaã®éšå±ã«æ¥ãã°ã«ãŒãã解æŸããŸãã
誰ããµã³ã¿ã«æ¥ããã«å¿ããŠã圌ã¯2ã€ã®ããšã®ãããããè¡ããŸã-èšç»äŒè°ãéå¬ããããèŽãç©ãé éããŸãã äœæ¥ãå®äºãããšããµã³ã¿ã¯ãã¢ã®ããã¯ã解é€ããã²ã¹ãã以åã®è·å Žã«é£ããŠè¡ããŸãã ã¿ã¹ã¯ã®ãã¹ãŠã®éæ³ã¯ãexit doorã¡ãœããã«ãããŸãã ãåãã®ããã«ããå埩ã¯äººéç¹æã®ãã®ã§ãããååž°ã¯ç¥èã§ããã -L.ããŒã¿ãŒãã€ãã¥ã ãã®ã¡ãœããã¯ã¡ã€ã³ã¹ã¬ããã®äžéšãšããŠåŒã³åºããããããå®å šã«ååž°çã«ãŠãŒã¶ãŒã«æ°ããã¿ã¹ã¯ãå®äºãããããšãã§ããŸãã ãšã«ããŸãã¯ã·ã«ã¯ãäžåºŠçãŸãããšã SIGABRTããé éšãžã®çŽæ¥å°æã«ãã£ãŠåæ¢ããããŸã§ãç¡æéã«è·åãéè¡ããŸã ã
ãããŠä»ãæã®æãæ¥ãŸããã
䟿å©ãªå Žæã«ã瀟å¡ãäœæããããã®ã³ãŒããé 眮ããå¿ èŠããããŸãã -ïŒvoidïŒviewDidLoadã«ãããŸã
è©©1ã
for (int i = 0; i<9; i++) [[[Deer alloc] init] execution]; for (int i = 0; i<10; i++) [[[Elf alloc] init] execution]; for (int i = 0; i<4; i++) [[[Santa alloc] init] execution];
ããããç§ãã¡ã¯ãã§ã«ã¹ã¬ããäœæã§ç¬ãé£ã¹ãã®ã§ãå¥ã®ã¹ã¬ããã§ãã¹ãŠãã©ããããŠã¿ãŸãããïŒ
è©©2ã
dispatch_async(dispatch_get_global_queue(0, 0), ^{ for (int i = 0; i<9; i++) [[[Deer alloc] init] execution]; for (int i = 0; i<10; i++) [[[Elf alloc] init] execution]; for (int i = 0; i<4; i++) [[[Santa alloc] init] execution]; });
å人ãå¥ã ã®ã¹ããªãŒã ã«äœãã§ããã®ã§ãå人ã®äœæã®é åºã¯å¶ç¶ã«ãã£ãŠã®ã¿æ±ºå®ãããããšã¯éåžžã«æçœã§ãã ã©ãããïŒ ç¹ã«ããã«ã¯ãã¹ã¬ããäœæã®é åºã瀺ãéåžžã«ãšã¬ã¬ã³ããªæ¹æ³ããããŸãã
è©©3ã
dispatch_async(dispatch_get_global_queue(0, 0), ^{ dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{for (int i = 0; i<30; i++) [[[Deer alloc] init] execution];}); dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{for (int i = 0; i<30; i++) [[[Elf alloc] init] execution];}); dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{for (int i = 0; i<10; i++) [[[Santa alloc] init] execution];}); });
æåã®ããã¯ã°ã©ãŠã³ãã¹ã¬ããã§ã¯ã鹿ãšãšã«ãã®äœæãéå§ãããã°ã«ãŒããäœæãããŸãã ãããŠãå®äºãããšããµã³ã¿ãäœæããã¹ã¬ãããèµ·åããŸãã
æåã®ã±ãŒã¹ã§ãããã³ã«ã次ã®ãããªå ŽåïŒ
>> 1-
1- 6
2- 7
3- 9
4- 4
5- 3
Yahoo!!!
7- 5
9- 2
Yahoo!!!
Yahoo!!!
Yahoo!!!
6- 8
3 . 15
5 . 17
4 . 10
2 . 16
8- 3
åŸè ã®å Žåã次ã®ããã«ãªããŸãã
1- 7
4- 5
3- 12
2- 7
5- 3
6- 4
7- 7
8- 11
9- 6
1 . 11
2 . 2
3 . 16
4 . 4
5 . 16
6 . 1
7 . 2
8 . 14
9 . 15
10 . 3
>> 1-
Yahoo!!!
Yahoo!!!
Yahoo!!!
Yahoo!!!
Yahoo!!!
Yahoo!!!
Yahoo!!!
Yahoo!!!
Yahoo!!!
Yahoo!!!
6
"Elf" 1
2
"Elf" 2
ãã®ã¢ããªã±ãŒã·ã§ã³ã®ãã°ã調ã¹ãããšã¯ãããªãèå³æ·±ãã¿ã¹ã¯ã§ãã ãããããããã¯ç¡éã«é·ãã®ã§ãç§ã¯ãŸã ã¢ã¯ã·ã§ã³ã®ã·ãŒã±ã³ã¹ãæãäžããã人ã«ã®ã¿ãªã³ã¯ãæäŸããããåé¡ã解決ããããã®åœŒãèªèº«ã®ããæé©ãªæ¹æ³ãæäŸããŸãã 以äžã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ãœãŒã¹ã³ãŒããžã®ãªã³ã¯ãæäŸããŸãã
ãã°ã§äœãé¢çœãã§ããããïŒ å®éãåæå®æ°ã®ç°ãªãå€ã¯ããŸã£ããç°ãªããã£ã©ã¯ã¿ãŒã®åäœãæäŸããŸãã ããšãã°ãåæã®ãããã°äžã«ããµã³ã¿ã¯äŒè°ã®ã«ãŒãã³ã§åžžã«å¿ãããããã®ããã®æäŸãéå§ããªãå¯èœæ§ãããããšãããããŸããã ã³ãŒãã®ãšã©ãŒã®é·ã倱æããæ€çŽ¢ã®åŸããã¹ãŠãæšæºçµ±èšã¢ãã«ã®ãã¬ãŒã ã¯ãŒã¯å ã«åãŸãããšãããããŸããããšã«ãã®ã¿ã¹ã¯å®è¡æéãçãããïŒ3ã4ãæïŒå Žåãã°ã«ãŒãã¯éåžžã«é »ç¹ã«åœ¢æãããããã鹿ã¯æ°žé ã«åŸ æ©ããŸããã¥ãŒïŒåé¡ãæ¡ä»¶ã®éã§è§£æ±ºãããããšãæãåºããŸãïŒã
ãã®æŒç¿ã®ç©æµäžã®äŸ¡å€ã¯äœã§ããïŒ ããªããã¹ã¯ã©ã ãããžã§ã¯ããããŒãžã£ãŒã§ãããšããŸãã ããªãã¯æ¯æ¥äŒè°ãéå¬ããªããã°ãªããªãã®ã§ãæã«ã¯ãœé£ã®æé«ãœããšãã®å šäœäŒè°ã«ç§»ãã®ã§ããšã«ãã«ã¯éçºã®æéããªãããããžã§ã¯ãã¯äžå®ã®æéçãã¬ãã·ã£ãŒæ®µéã«å ¥ãããšããããŸãã ããŒã ãªãŒããŒ-ãµãŒããŒéçºè -ã¯ã©ã€ã¢ã³ãéçºè ã®ãã©ã€ã¢ã³ã°ã«ã§ãåæ§ã®ç¶æ³ãçºçããå¯èœæ§ããããŸãããå¯äžã®éãã¯ãããŒã ãªãŒããŒã¯éåžžãå³æã®è²¬ä»»ïŒsleepïŒïŒ;ïŒã®å±¥è¡ãåæ¢ããããã«ã€ãŸãã¯æªæã®ããã³ãŒãã匷å¶çã«ã¬ã€ã¯ããããšã§ããšã«ãã ãŸããITåéããè±åŽããå Žåããµã³ã¿ã®ã¿ã¹ã¯ä¿æ°ã¯ãååã®ç©ã¿èŸŒã¿/ç©ã¿éãã/å庫ä¿ç®¡ã®ããã»ã¹ã®åºæ¬ãšãªããŸãã äžè¬ã«ãå®ç掻ã§ã¢ããã°ãèŠã€ããã®ã¯ç°¡åã§ãã
çµè«ïŒ
äžèšã®ã³ãŒãã«ã¯ãæ確ã«ããããªãããªãã¯ãããã€ããããŸãã
1ïŒ
NSMutableArray *group = [NSMutableArray array]; [skip] return [group copy];
ARCãªãã§ãŸã åããŠããããã°ã©ããŒã¯ããã®ã³ãŒãã«æãããã§ãããã ãããŠãã»ãšãã©ã®å Žåã[[NSArray arrayWithArrayïŒgroup] autorelise];ã®ãããªãã®ã䜿çšããŸãã ãªããžã§ã¯ããæå°æ©èœã«æãããã¿ãŸãã ãã ããARCã¯ãã®å¿ èŠæ§ãæé€ããã³ãŒãã¯ããéæã«ãªããŸãã
2ïŒ
- (Santa *)portalOut:(NSArray *)group { [skip] return self; }
çŸåšã®ãªããžã§ã¯ããè¿ãã¡ãœããã䜿çšãããšããžã£ã³ãã¬ã³ãŒãObjective-Cã䜿çšããããšã§ããªã¹ããæžããããšãã§ããŸãïŒ[self portalOutïŒcurrentGroup] sleep]; é¢æ°åèšèªãæ¡åŒµå¯èœãªCïŒã¡ãœããïŒLINQã§ç©æ¥µçã«äœ¿çšãããŠããïŒã奜ããªäººã«ãšã£ãŠãããã¯éã®éŠæ²¹ã®ãããªãã®ã§ã...ãã¡ããããããã°ã®ç®çã§ã¯ãã¡ãœããåŒã³åºãã2è¡ã«åå²ããã®ãçã«ããªã£ãŠããŸãã
3ïŒ
#if kAllMessages NSLog(@" %d . %d ", number, month); #endif
kAllMessagesããªã³ã³ãã€ã«ãã£ã¬ã¯ãã£ãã¯Common.hãã¡ã€ã«ã«å«ãŸããŠããŸããã³ã¡ã³ãã解é€ãããšãäžèšã®ãã°ã®ããã«ããã£ã©ã¯ã¿ãŒã«ãã£ãŠå®è¡ããããã¹ãŠã®ã¢ã¯ã·ã§ã³ã衚瀺ãããŸãã ããã©ã«ãã§ã¯ããµã³ã¿ã®ã¢ã¯ã·ã§ã³ã®ã¿ãã³ã³ãœãŒã«ã«è¡šç€ºãããŸãã èšäºã®ã³ã³ãœãŒã«åºåã«ã€ããŠã¯è§ŠããŸããã§ãããéåžžãããã¯ãobjective-cãåŠç¿ããéã«å§ããæåã®ç¥ãåãã ããã§ãã
ã«ããŽãªãŒçåœä»€ïŒ
èšäºãæžãã®ã¯ãã¢ããªã±ãŒã·ã§ã³ãæžããŠãããã°ãããããæ°åæéãããããŸããã éåæãããŒãžã£ãŒããŸã 䜿çšããŠããªãå Žåã¯ãè©ŠããŠã¿ãŠå®è£ ã®å®¹æããè©äŸ¡ããŠãã ããã ãããŠãã¯ãã圌ã¯ãAppleããã«ãã¹ã¬ããã¢ããªã±ãŒã·ã§ã³ã®æµã¿ã®ããŒã¯ã«éããããšãªããã®åé¡ã解決ã§ãããšä¿¡ããŠããç§ã«ç³ãæããããŠãã ããã
åç §ïŒ
ã¢ããªã±ãŒã·ã§ã³ã®ãœãŒã¹ã³ãŒãïŒiOS SDK 5ãXcode 4.3ïŒã
ã¹ã¬ããå®è¡ã°ã«ãŒãã®ãªãã¢ããªã±ãŒã·ã§ã³ãã°ã
ã¹ã¬ããå®è¡ã°ã«ãŒããå«ãã¢ããªã±ãŒã·ã§ã³ãã°ã
ã¹ã¬ããã°ã«ãŒãå ã®ãµã³ã¿ã®äœæ¥ã®ç¥èªã
èŠçŽïŒ
ãã®èšäºã§ã¯ãiOS SDK 3以éã«é©çšãããObjective-Cèšèªã§ãã«ãã¹ã¬ããã¢ããªã±ãŒã·ã§ã³ãäœæããã¡ã«ããºã ã«ã€ããŠèª¬æããŸãã ããžã¹ãã£ã¯ã¹åéã§ã®ãµã³ã¿ã®ä»äºãäŸãšããŠåŒçšãããŸããã éåæãã£ã¹ãããã£ã䜿çšãããœãŒã¹ã³ãŒãã®ãã¢
dispatch_async,
ã¢ããªã±ãŒã·ã§ã³ã¹ã¬ãããã¥ãŒ ã¢ããªã±ãŒã·ã§ã³ããã¯ã°ã©ãŠã³ãã¹ã¬ããdispatch_get_main_queue()
ãããã³é 延éédispatch_get_global_queue
[NSThread sleepForTimeInterval:month];
ã Objective-CãæäŸããç·åœ¢é
åãšåçèŸæžã䜿çšããŠãè¿œå ã®ãã¥ãŒãäœæããŸããã
UPDïŒãœãŒã¹ã³ãŒããžã®ãªã³ã¯ãæŽæ°ããŸããã