Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

ひろ子 in Objective-C

6,027 views

Published on

Published in: Software, Technology, Business

ひろ子 in Objective-C

  1. 1. who is ひろ子 ?
  2. 2. void hiroko(int height) { if(height < 180) height = 180; } 正しくない hiroko の実装
  3. 3. void hiroko(int *height) { if(*height < 180) *height = 180; } 正しい hiroko の実装(多分
  4. 4. int h1 = 195; hiroko(&h1); NSLog(@"h1: %d", h1);
  5. 5. int h1 = 195; hiroko(&h1); NSLog(@"h1: %d", h1); 2014-05-09 14:09:40.299 Hiroko[23593:60b] h1: 195 理想通りなのでOK
  6. 6. int h1 = 195; hiroko(&h1); NSLog(@"h1: %d", h1); 2014-05-09 14:09:40.299 Hiroko[23593:60b] h1: 195 int h2 = 175; hiroko(&h2); NSLog(@"h2: %d", h2);
  7. 7. int h1 = 195; hiroko(&h1); NSLog(@"h1: %d", h1); 2014-05-09 14:09:40.301 Hiroko[23593:60b] h2: 180 2014-05-09 14:09:40.299 Hiroko[23593:60b] h1: 195 int h2 = 175; hiroko(&h2); NSLog(@"h2: %d", h2); ちゃんと超能力が働いてる
  8. 8. 解説 int h = 175; ! int *p; p = &h; *p = 180; ! NSLog(@"h: %d", h);
  9. 9. 解説 int h = 175; ! int *p; p = &h; *p = 180; ! NSLog(@"h: %d", h); 175 h: 0xbfffca44
  10. 10. 解説 int h = 175; ! int *p; p = &h; *p = 180; ! NSLog(@"h: %d", h); 175 h: 0xbfffca44 NULL p: 0xbfffca40
  11. 11. 解説 int h = 175; ! int *p; p = &h; *p = 180; ! NSLog(@"h: %d", h); 175 h: 0xbfffca44 0xbfffca44 p: 0xbfffca40
  12. 12. 解説 int h = 175; ! int *p; p = &h; *p = 180; ! NSLog(@"h: %d", h); 180 h: 0xbfffca44 0xbfffca44 p: 0xbfffca40
  13. 13. 解説 int h = 175; ! int *p; p = &h; *p = 180; ! NSLog(@"h: %d", h); 2014-05-09 14:09:40.299 Hiroko[23593:60b] h: 180
  14. 14. ひろ子パターン: 「どうぞ書き換えて下さい」
  15. 15. ひろ子 in Objective-C?
  16. 16. @interface Hiroko : NSObject ! - (void)doHirokoWithHeight:(CGFloat *)height; ! @end …?
  17. 17. Objective-C (Cocoa) では、 あまりひろ子パターンは出て来ない。
  18. 18. NSArray *array = @[@"a", @"b", @"c"]; ! [array enumerateObjectsUsingBlock: ^(id obj, NSUInteger idx, BOOL *stop) { ! NSLog(@"%@", obj); if([obj isEqual:@"b"]) *stop = YES; }]; ! NSLog(@"end"); ひろ子パターン その1: - [NSArray enumerateObjectsUsingBlock:]
  19. 19. NSArray *array = @[@"a", @"b", @"c"]; ! [array enumerateObjectsUsingBlock: ^(id obj, NSUInteger idx, BOOL *stop) { ! NSLog(@"%@", obj); if([obj isEqual:@"b"]) *stop = YES; }]; ! NSLog(@"end"); ひろ子パターン その1: - [NSArray enumerateObjectsUsingBlock:]
  20. 20. NSArray *array = @[@"a", @"b", @"c"]; ! [array enumerateObjectsUsingBlock: ^(id obj, NSUInteger idx, BOOL *stop) { ! NSLog(@"%@", obj); if([obj isEqual:@"b"]) *stop = YES; }]; ! NSLog(@"end"); ひろ子パターン その1: - [NSArray enumerateObjectsUsingBlock:]
  21. 21. NSArray *array = @[@"a", @"b", @"c"]; ! [array enumerateObjectsUsingBlock: ^(id obj, NSUInteger idx, BOOL *stop) { ! NSLog(@"%@", obj); if([obj isEqual:@"b"]) *stop = YES; }]; ! NSLog(@"end"); 2014-05-09 14:50:04.508 Hiroko[24612:60b] a 2014-05-09 14:50:04.509 Hiroko[24612:60b] b 2014-05-09 14:50:04.509 Hiroko[24612:60b] end ひろ子パターン その1: - [NSArray enumerateObjectsUsingBlock:]
  22. 22. NSData *data = ...; ! NSError *error = nil; ! id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; if(json && !error) { ... } ひろ子パターン その2: NSError ** として
  23. 23. NSData *data = ...; ! NSError *error = nil; ! id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; if(json && !error) { ... } ひろ子パターン その2: NSError ** として nil NSError *error NSError
  24. 24. NSData *data = ...; ! NSError *error = nil; ! id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; if(json && !error) { ... } ひろ子パターン その2: NSError ** として nil NSError *error 0xf8193ab NSError **errorPtr NSError 引数として渡される
  25. 25. NSData *data = ...; ! NSError *error = nil; ! id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; if(json && !error) { ... } ひろ子パターン その2: NSError ** として nil NSError *error 0xf8193ab NSError **errorPtr (オブジェクトの実体) NSError エラー発生!
  26. 26. NSData *data = ...; ! NSError *error = nil; ! id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; if(json && !error) { ... } ひろ子パターン その2: NSError ** として 0xf19274a NSError *error 0xf8193ab NSError **errorPtr (オブジェクトの実体) NSError 代入されて処理が戻る
  27. 27. NSData *data = ...; ! NSError *error = nil; ! id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; if(json && !error) { ... } ひろ子パターン その2: NSError ** として 0xf19274a NSError *error (オブジェクトの実体) NSError ↑ nil でなくなっているので通らない
  28. 28. Objective-C でも ひろ子はたまに出てくる。
  29. 29. Thanks.

×