NDS36 Objective-C

NDS36 Objective-C

2014/03/15 NDS36 発表資料

F588267d3e7e23475cad3933226c1e96?s=128

Shintaro Abe

March 11, 2014
Tweet

Transcript

  1. OBJECTIVE-C 2014/03/15 SAT. NAGAOKA DEVELOPERS STUDY #36 DICTAV (SHINTARO ABE)

  2. DICTAV • ৽ׁࢢࡏॅ IOSϓϩ άϥϚ

  3. ϓϩάϥϛϯάݴޠྺ ߴઐॳظ HTML/C/Java/BASIC ߴઐதظ ߴઐ࣌୅ɺ ߴઐޙظ ߴઐͷଔ࿦Ͱແཧ໼ཧ ߴઐޙظ ߴઐͷޙഐʹ ࣗӴୂॳظ

    MFC ࣗӴୂதظ JOVIAL ࣗӴୂޙظ Ruby ϑϦʔ Objective-C ࠷ۙ Go
  4. OBJECTIVE-C #import <Foundation/Foundation.h> ! @interface MyObject : NSObject @end !

    @implementation MyObject - (void) helloWorld { printf("Hello, World!\n"); } @end ! ! int main(int argc, char **argv) { id obj = [MyObject new]; [obj helloWorld]; ! return 0; }
  5. OBJECTIVE-C ͱ͸ • 1983೥ੜ·ΕʢC++ͱಉ͡ʣ • C ͷεʔύʔηοτ • C++: better

    C • Objective-C: C & Object System • runtime + Foundation framework (+ AppKit)
  6. MACઐ༻Ͱ͠ΐʁ • GNUStep ΛೖΕΕ͹WindowsͰ΋͏͘͝ • Grand Central Dispatch • Blocks

    • Clang + LLVM
  7. GNUSTEP • ϓϩϓϥΠΤλϦͳιϑτ΢ΣΞͰ͋ͬͨ NEXTSTEP ΛϋοΫͨ͠ͷ͕࢝·Γ • NeXT(+Sun Microsystems)͕OPENSTEPͱͯ͠ެ։ • OPENSTEP࢓༷ʹ׬શޓ׵ͳϓϥοτϑΥʔϜ

    • Cocoaʹ௥ਵ
  8. ͲΜͳݴޠ • ΦϒδΣΫτࢦ޲ݴޠ • ΦϒδΣΫτͷϝιουݺͼग़͠͸[]Ͱғ·Εͨ ϝοηʔδࣜ

  9. Ϋϥε @interface MyObject : NSObject @property (strong) NSString *username; -

    (id)initWithName:(NSString*)name; - (void)helloToName:(NSString*)name; @end ! @implementation MyObject { NSString *myName; } - (id)initWithName:(NSString*)name { self = [super init]; myName = name return self; } - (void)helloToName:(NSString*)name { printf(“hello %s\n”, [name UTF8String]); } @end
  10. Α͘࢖͏Ϋϥε • id (Any) • NSString • NSNumber • NSArray

    • NSDictionary • NSURL • NSURLConnection (NSURLSession) • NSOperationQueue
  11. ೔ຊਓ͕஌͓ͬͯ͘΂͖ ৽̏େɾOBJECTIVE-CϓϩάϥϛϯάελΠϧ • σϦήʔτ • Φϒαʔόʔ • ࢀরΧ΢ϯτํࣜ • ARC

    : Automatic Reference Counting
  12. σϦήʔτ • GoFຊͷAdapterύλʔϯ • UIपΓͰ޿͘׆༻͞Ε͍ͯΔ

  13. σϦήʔτ @protocol DLDelegate <NSObject> - (NSURL*)nextURL; - (void)didFinishDownload:(id)object; @end !

    @interface MyDownloader : NSObject @property (assign) id<DLDelegate> delegate @end ! @implementation MyDownloader - (void) downloadAsync { NSURL *url; while(url = [self.delegate nextURL]){ /* μ΢ϯϩʔυ*/ [self.delegate didFinishDownload:obj]; } } @end @interface MyObj:NSObject<DLDelegate> @end ! @implementation MyObject { MyDownloader *dw; } - (id)init { self = [super init]; dw = [MyDownloader new]; dw.delegate = self; [dw downloadAsync]; return self; } - (NSURL*)nextURL { NSURL *u = //… return u; } - (void) didFinishDownload:(id)obj { /* ޙॲཧ */ } @end
  14. σϦήʔτ ϝΠϯ Ϋϩʔϥ URL͍ͩ͘͞ ը૾Ͳͧ

  15. σϦήʔτ ϝΠϯ Ϋϩʔϥ URL͍ͩ͘͞ ը૾Ͳͧ Vim޷͖ URL͍ͩ͘͞ ը૾Ͳͧ Vim ͱ͔Α͘෼͔Βͳ͍

    ͠໘౗ͩͳ ͻΌͬ΄ʔ
  16. σϦήʔτ @protocol DLDelegate <NSObject> - (NSURL*)nextURL; - (void)didFinishDownload:(id)object; @end !

    @interface MyDownloader : NSObject @property (assign) id<DLDelegate> delegate @end ! @implementation MyDownloader - (void) downloadAsync { NSURL *url; while(url = [self.delegate nextURL]){ /* μ΢ϯϩʔυ*/ [self.delegate didFinishDownload:obj]; } } @end
  17. Φϒαʔόʔ • GoFຊͷObserverύλʔϯ • ΦϒδΣΫτͷΠϯελϯεม਺Λ؂ࢹͯ͠ॲཧΛ ߦ͏

  18. Φϒαʔόʔ @implementation Senshi - (id) init { self = [super

    init]; [self addObserver: self forKeyPath: @“hitPoint” options: NSKeyValueObservingOptionInitial context: NULL]; return self; } ! - (void)observeValueForKeyPath:(NSString *)keyPath… { if ([keyPath isEqual:@“hitPoint”]) { /* Կ͔͢Δ */ } } ! - (void)damage:(NSInteger)damage { self.hitPoint = self.hitPoint - damage; } @end
  19. Φϒαʔόʔ @implementation Souryo - (void) mimamoruSenshi:(Senshi*)senshi { [senshi addObserver: self

    forKeyPath: @“hitPoint” options: NSKeyValueObservingOptionInitial context: NULL]; } ! - (void) observeValueForKeyPath:(NSString *)keyPath… { if ([keyPath isEqual:@“hitPoint”]) { /* ճ෮͢Δ */ } } @end
  20. ࢀরΧ΢ϯτ - (void) hello:(NSString*)str { [str retain]; MyObject *obj =

    [MyObject new]; ! /* Կ͔ॲཧ */ ! [obj release]; [str release]; } ! - (void) helloWorld { NSString *str = @“world”; [self hello:str]; [str release]; } ·͔͞ͷʂʂ ! ࢀরΧ΢ϯτํࣜ ϓϩάϥϛϯά
  21. ࢀরΧ΢ϯτ - (void) hello:(NSString*)str { [str retain]; MyObject *obj =

    [MyObject new]; ! /* Կ͔ॲཧ */ ! [obj release]; [str release]; } ! - (void) helloWorld { NSString *str = @“world”; [self hello:str]; [str release]; } ίϯύΠϥ͕΍ͬͯ͘ΕΔΑ͏ʹͳΓ ·ͨ͠ɻ
  22. ࢀরΧ΢ϯτ - (void) hello:(NSString*)str { [str retain]; MyObject *obj =

    [MyObject new]; ! /* Կ͔ॲཧ */ ! [obj release]; [str release]; } ! - (void) helloWorld { NSString *str = @“world”; [self hello:str]; [str release]; } - (void) hello:(NSString*)str { [str retain]; MyObject *obj = [MyObject new]; ! /* Կ͔ॲཧ */ ! [obj release]; [str release]; } ! - (void) helloWorld { NSString *str = @“world”; [self hello:str]; [str release]; }
  23. Cͷ֦ு • Blocks • Grand Central Dispatch

  24. BLOCKS // prepare void HelloWorld(void) { printf("Hello, World!\n"); } !

    void DoFunc(void (*pfunc)()) { (*pfunc)(); } ! // main void main(void) { DoFunc(HelloWorld); }
  25. BLOCKS // prepare void DoBlock(void (^block)(void)) { block(); } !

    // main void main(void) { DoBlock(^{ printf(“Hello, World!\n”); }); }
  26. BLOCKS // prepare void DoBlock10(void (^block)(int n)) { for (int

    i=0; i < 10; i++) { block(i); } } ! // main void main(void) { DoBlock10(^(int n){ printf("Hello, Block %d!\n", n); }); }
  27. GCD: GRAND CENTRAL DISPATCH “λεΫΛඇಉظʹ࣮ߦ͢Δٕज़ͷͻͱͭͱͯ͠ɺGrand Central DispatchʢGCDʣͱ͍͏΋ͷ͕͋Γ·͢ɻ௨ৗ͸ΞϓϦέʔγϣϯதʹ هड़͢ΔεϨου؅ཧ༻ͷίʔυΛɺγεςϜϨϕϧͰ࣮૷ͨ͠΋ͷͰ ͢ɻ։ൃऀ͕͠ͳ͚Ε͹ͳΒͳ͍ͷ͸ɺ࣮ߦ͍ͨ͠λεΫΛఆٛ͠ɺద ੾ͳDispatch

    Queueʹ௥Ճ͢Δ͜ͱ͚ͩͰ͢ɻ͢ΔͱGCD͸ɺඞཁͳε ϨουΛੜ੒͠ɺͦ͜ͰλεΫΛ࣮ߦ͢ΔΑ͏ద੾ʹεέδϡʔϦϯά ͠·͢ɻεϨου؅ཧ͕γεςϜͷҰ෦ͱͯ͠૊Έࠐ·Ε͍ͯΔͷͰɺ શମΛݟ౉ͯ͠λεΫΛ؅ཧɺ࣮ߦͰ͖ɺैདྷͷεϨουΑΓ΋ޮ཰͕ ޲্͠·͢ɻ” Excerpt From: “ฒྻϓϩάϥϛϯάΨΠυ” https://developer.apple.com/jp/devcenter/ios/library/ documentation/ConcurrencyProgrammingGuide.pdf
  28. GCD // prepare dispatch_queue_priority_t priority; dispatch_queue_t queue; ! priority =

    DISPATCH_QUEUE_PRIORITY_DEFAULT; queue = dispatch_get_global_queue(priority, 0); ! // main printf(“1,"); ! dispatch_async(queue, ^{ printf("3"); }); printf(“2,”); ! // results => 1,2,3
  29. NSOPERATIONQUEUE // https://t.co/6LbHw8F9UU // prepare NSOperationQueue *queue; queue = [NSOperationQueue

    new]; ! ! ! // main printf(“1,"); ! [queue addOperationWithBlock:^{ printf("3"); }]; printf(“2,”); ! // results => 1,2,3 // prepare dispatch_queue_priority_t priority; dispatch_queue_t queue; ! priority = DISPATCH_QUEUE_PRIORITY_DEFAULT; queue = dispatch_get_global_queue(priority,0); ! // main printf(“1,"); ! dispatch_async(queue, ^{ printf("3"); }); printf(“2,”); ! // results => 1,2,3
  30. ·ͱΊ • Objective-C ͸Appleઐ༻ͷݴޠͰ͸ͳ͍Α • Blocks ΍ GCD Λ࢖͏ͱ͜Ε·Ͱ໘౗ͩͬͨ C

    ݴޠ ͷϓϩάϥϛϯά͕Ұ෦ָʹͳΔΑ • Overrideͱ͔͍͢͝ΏΔ͍͔Βڵຯ͋Ε͹Ͳ͏ͧ
  31. ࠂ஌ • ΞϓϦϦϦʔε • ΋͘΋͘ձ

  32. ΞϓϦϦϦʔεʂ • ΞϓϦΛϦϦʔε͠·ͨ͠ਃ੥தͰ͢ • ࠓ͸ΘΓͱՋͰ͢ • ̍೥ޙʹ࢓ࣄͳ͘ͳΔ͔΋ɻΑΖ͓͘͠ئ͍͠·͢ɻ

  33. ৽ׁ΋͘΋͘ձ΍ͬͯ·͢ʂ • ݄̏͘Β͍Ͱ౔༵೔ʹʮ৽ׁ΋͘΋͘ձʯ΍ͬͯ· ͢ɻ • ࠷େ໊̔ऩ༰ՄೳɻࢀՃඅແྉʂ • ౔༵೔ʹՈʹ͍ͨ͘ͳ͍ਓ͸ͥͻ • ଞͷ༵೔ͷر๬΋ͥͻ

    • ษڧձ։͖͍ͨਓ΋͝૬ஊ͍ͩ͘͞
  34. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠