Upgrade to Pro — share decks privately, control downloads, hide ads and more …

NDS36 Objective-C

NDS36 Objective-C

2014/03/15 NDS36 発表資料

Shintaro Abe

March 11, 2014
Tweet

More Decks by Shintaro Abe

Other Decks in Programming

Transcript

  1. 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; }
  2. OBJECTIVE-C ͱ͸ • 1983೥ੜ·ΕʢC++ͱಉ͡ʣ • C ͷεʔύʔηοτ • C++: better

    C • Objective-C: C & Object System • runtime + Foundation framework (+ AppKit)
  3. Ϋϥε @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
  4. Α͘࢖͏Ϋϥε • id (Any) • NSString • NSNumber • NSArray

    • NSDictionary • NSURL • NSURLConnection (NSURLSession) • NSOperationQueue
  5. σϦήʔτ @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
  6. σϦήʔτ @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
  7. Φϒαʔόʔ @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
  8. Φϒαʔόʔ @implementation Souryo - (void) mimamoruSenshi:(Senshi*)senshi { [senshi addObserver: self

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

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

    [MyObject new]; ! /* Կ͔ॲཧ */ ! [obj release]; [str release]; } ! - (void) helloWorld { NSString *str = @“world”; [self hello:str]; [str release]; } ίϯύΠϥ͕΍ͬͯ͘ΕΔΑ͏ʹͳΓ ·ͨ͠ɻ
  11. ࢀরΧ΢ϯτ - (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]; }
  12. BLOCKS // prepare void HelloWorld(void) { printf("Hello, World!\n"); } !

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

    // main void main(void) { DoBlock(^{ printf(“Hello, World!\n”); }); }
  14. 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); }); }
  15. GCD: GRAND CENTRAL DISPATCH “λεΫΛඇಉظʹ࣮ߦ͢Δٕज़ͷͻͱͭͱͯ͠ɺGrand Central DispatchʢGCDʣͱ͍͏΋ͷ͕͋Γ·͢ɻ௨ৗ͸ΞϓϦέʔγϣϯதʹ هड़͢ΔεϨου؅ཧ༻ͷίʔυΛɺγεςϜϨϕϧͰ࣮૷ͨ͠΋ͷͰ ͢ɻ։ൃऀ͕͠ͳ͚Ε͹ͳΒͳ͍ͷ͸ɺ࣮ߦ͍ͨ͠λεΫΛఆٛ͠ɺద ੾ͳDispatch

    Queueʹ௥Ճ͢Δ͜ͱ͚ͩͰ͢ɻ͢ΔͱGCD͸ɺඞཁͳε ϨουΛੜ੒͠ɺͦ͜ͰλεΫΛ࣮ߦ͢ΔΑ͏ద੾ʹεέδϡʔϦϯά ͠·͢ɻεϨου؅ཧ͕γεςϜͷҰ෦ͱͯ͠૊Έࠐ·Ε͍ͯΔͷͰɺ શମΛݟ౉ͯ͠λεΫΛ؅ཧɺ࣮ߦͰ͖ɺैདྷͷεϨουΑΓ΋ޮ཰͕ ޲্͠·͢ɻ” Excerpt From: “ฒྻϓϩάϥϛϯάΨΠυ” https://developer.apple.com/jp/devcenter/ios/library/ documentation/ConcurrencyProgrammingGuide.pdf
  16. 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
  17. 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
  18. ·ͱΊ • Objective-C ͸Appleઐ༻ͷݴޠͰ͸ͳ͍Α • Blocks ΍ GCD Λ࢖͏ͱ͜Ε·Ͱ໘౗ͩͬͨ C

    ݴޠ ͷϓϩάϥϛϯά͕Ұ෦ָʹͳΔΑ • Overrideͱ͔͍͢͝ΏΔ͍͔Βڵຯ͋Ε͹Ͳ͏ͧ