Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
NDS36 Objective-C
Search
Shintaro Abe
March 11, 2014
Programming
1.6k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
NDS36 Objective-C
2014/03/15 NDS36 発表資料
Shintaro Abe
March 11, 2014
More Decks by Shintaro Abe
See All by Shintaro Abe
アルコールストーブの作り方
dictav
0
310
Swiftを少しだけ
dictav
0
300
Ruby
dictav
0
1.6k
Other Decks in Programming
See All in Programming
XP祭りでしか伝わらないフリップネタ #xpjug
murabayashi
0
150
App Storeの外へ──日本のiOSサイドローディング入門 for iOSDC Japan 2026
yuukiw00w
0
200
フロントエンドUIフレームワークのこれまでとこれから
ssssota
5
2.6k
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
390
Go のフラットな パッケージに 「ファイル単位の private」を 〜Linter “declscope” を作った話〜
mpyw
0
230
技術的負債の返済は、AI時代の複利で効く投資 — 経営としての意思決定とその遂行
curekoshimizu
0
730
ゲームコントローラやキーボードのファームウェアをSwiftで書く
kishikawakatsumi
1
230
Heart of Swift Concurrency
koher
0
500
How I Stole PSI from Android Studio - DroidKaigi2026
worker8
0
120
巨大モノリシックアプリ モダン化大作戦
ktcryomm
0
980
GraphRAGのKnowledge Graphを 直接!見る/View-GraphRAG's-KnowledgeGraph-directly!
tyumugi1113
1
300
[DroidKaigi 2026] Bring your own phones to Gradle Managed Devices
f2lk
0
120
Featured
See All Featured
Optimizing for Happiness
mojombo
378
71k
How to Think Like a Performance Engineer
csswizardry
28
2.8k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
530
Large-scale JavaScript Application Architecture
addyosmani
515
110k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
Mind Mapping
helmedeiros
1
360
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
410
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Leo the Paperboy
mayatellez
9
2.3k
Fireside Chat
paigeccino
43
4k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Transcript
OBJECTIVE-C 2014/03/15 SAT. NAGAOKA DEVELOPERS STUDY #36 DICTAV (SHINTARO ABE)
DICTAV • ৽ׁࢢࡏॅ IOSϓϩ άϥϚ
ϓϩάϥϛϯάݴޠྺ ߴઐॳظ HTML/C/Java/BASIC ߴઐதظ ߴઐ࣌ɺ ߴઐޙظ ߴઐͷଔͰແཧཧ ߴઐޙظ ߴઐͷޙഐʹ ࣗӴୂॳظ
MFC ࣗӴୂதظ JOVIAL ࣗӴୂޙظ Ruby ϑϦʔ Objective-C ࠷ۙ Go
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; }
OBJECTIVE-C ͱ • 1983ੜ·ΕʢC++ͱಉ͡ʣ • C ͷεʔύʔηοτ • C++: better
C • Objective-C: C & Object System • runtime + Foundation framework (+ AppKit)
MACઐ༻Ͱ͠ΐʁ • GNUStep ΛೖΕΕWindowsͰ͏͘͝ • Grand Central Dispatch • Blocks
• Clang + LLVM
GNUSTEP • ϓϩϓϥΠΤλϦͳιϑτΣΞͰ͋ͬͨ NEXTSTEP ΛϋοΫͨ͠ͷ͕࢝·Γ • NeXT(+Sun Microsystems)͕OPENSTEPͱͯ͠ެ։ • OPENSTEP༷ʹશޓͳϓϥοτϑΥʔϜ
• Cocoaʹਵ
ͲΜͳݴޠ • ΦϒδΣΫτࢦݴޠ • ΦϒδΣΫτͷϝιουݺͼग़͠[]Ͱғ·Εͨ ϝοηʔδࣜ
Ϋϥε @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
Α͘͏Ϋϥε • id (Any) • NSString • NSNumber • NSArray
• NSDictionary • NSURL • NSURLConnection (NSURLSession) • NSOperationQueue
ຊਓ͕͓͖ͬͯ͘ ৽̏େɾOBJECTIVE-CϓϩάϥϛϯάελΠϧ • σϦήʔτ • Φϒαʔόʔ • ࢀরΧϯτํࣜ • ARC
: Automatic Reference Counting
σϦήʔτ • GoFຊͷAdapterύλʔϯ • UIपΓͰ͘׆༻͞Ε͍ͯΔ
σϦήʔτ @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
σϦήʔτ ϝΠϯ Ϋϩʔϥ URL͍ͩ͘͞ ը૾Ͳͧ
σϦήʔτ ϝΠϯ Ϋϩʔϥ URL͍ͩ͘͞ ը૾Ͳͧ Vim͖ URL͍ͩ͘͞ ը૾Ͳͧ Vim ͱ͔Α͔͘Βͳ͍
͠໘ͩͳ ͻΌͬ΄ʔ
σϦήʔτ @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
Φϒαʔόʔ • GoFຊͷObserverύλʔϯ • ΦϒδΣΫτͷΠϯελϯεมΛࢹͯ͠ॲཧΛ ߦ͏
Φϒαʔόʔ @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
Φϒαʔόʔ @implementation Souryo - (void) mimamoruSenshi:(Senshi*)senshi { [senshi addObserver: self
forKeyPath: @“hitPoint” options: NSKeyValueObservingOptionInitial context: NULL]; } ! - (void) observeValueForKeyPath:(NSString *)keyPath… { if ([keyPath isEqual:@“hitPoint”]) { /* ճ෮͢Δ */ } } @end
ࢀরΧϯτ - (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]; } ίϯύΠϥ͕ͬͯ͘ΕΔΑ͏ʹͳΓ ·ͨ͠ɻ
ࢀরΧϯτ - (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]; }
Cͷ֦ு • Blocks • Grand Central Dispatch
BLOCKS // prepare void HelloWorld(void) { printf("Hello, World!\n"); } !
void DoFunc(void (*pfunc)()) { (*pfunc)(); } ! // main void main(void) { DoFunc(HelloWorld); }
BLOCKS // prepare void DoBlock(void (^block)(void)) { block(); } !
// main void main(void) { DoBlock(^{ printf(“Hello, World!\n”); }); }
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); }); }
GCD: GRAND CENTRAL DISPATCH “λεΫΛඇಉظʹ࣮ߦ͢Δٕज़ͷͻͱͭͱͯ͠ɺGrand Central DispatchʢGCDʣͱ͍͏ͷ͕͋Γ·͢ɻ௨ৗΞϓϦέʔγϣϯதʹ هड़͢ΔεϨουཧ༻ͷίʔυΛɺγεςϜϨϕϧͰ࣮ͨ͠ͷͰ ͢ɻ։ൃऀ͕͠ͳ͚ΕͳΒͳ͍ͷɺ࣮ߦ͍ͨ͠λεΫΛఆٛ͠ɺద ͳDispatch
QueueʹՃ͢Δ͜ͱ͚ͩͰ͢ɻ͢ΔͱGCDɺඞཁͳε ϨουΛੜ͠ɺͦ͜ͰλεΫΛ࣮ߦ͢ΔΑ͏దʹεέδϡʔϦϯά ͠·͢ɻεϨουཧ͕γεςϜͷҰ෦ͱͯ͠Έࠐ·Ε͍ͯΔͷͰɺ શମΛݟͯ͠λεΫΛཧɺ࣮ߦͰ͖ɺैདྷͷεϨουΑΓޮ͕ ্͠·͢ɻ” Excerpt From: “ฒྻϓϩάϥϛϯάΨΠυ” https://developer.apple.com/jp/devcenter/ios/library/ documentation/ConcurrencyProgrammingGuide.pdf
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
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
·ͱΊ • Objective-C Appleઐ༻ͷݴޠͰͳ͍Α • Blocks GCD Λ͏ͱ͜Ε·Ͱ໘ͩͬͨ C
ݴޠ ͷϓϩάϥϛϯά͕Ұ෦ָʹͳΔΑ • Overrideͱ͔͍͢͝ΏΔ͍͔Βڵຯ͋ΕͲ͏ͧ
ࠂ • ΞϓϦϦϦʔε • ͘͘ձ
ΞϓϦϦϦʔεʂ • ΞϓϦΛϦϦʔε͠·ͨ͠ਃதͰ͢ • ࠓΘΓͱՋͰ͢ • ̍ޙʹࣄͳ͘ͳΔ͔ɻΑΖ͓͘͠ئ͍͠·͢ɻ
৽ׁ͘͘ձͬͯ·͢ʂ • ݄̏͘Β͍Ͱ༵ʹʮ৽ׁ͘͘ձʯͬͯ· ͢ɻ • ࠷େ໊̔ऩ༰ՄೳɻࢀՃඅແྉʂ • ༵ʹՈʹ͍ͨ͘ͳ͍ਓͥͻ • ଞͷ༵ͷرͥͻ
• ษڧձ։͖͍ͨਓ͝૬ஊ͍ͩ͘͞
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠