Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
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
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
610
Prismを使った型安全な暗号化_関数型まつり2026
_fhhmm
0
150
「正の参照」と 「負の導出」で組む ハーネスエンジニアリング
cottpan
1
150
えっ!!コードを読まずに開発を!?
hananouchi
0
230
【SRE NEXT 2026 Lunch Session】一人目専任SREの立ち上げを加速する ― AIと進めたオンボーディングで2分を0.04秒にした話
pkshadeck
PRO
0
2.9k
5分で問診!Composer セキュリティ健康診断
codmoninc
0
560
GitHubCopilotCLIのスラッシュコマンドを自作してみる
htkym
0
100
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
4
1.7k
AI駆動開発を妨げる技術的負債の解消アプローチ / ai-refactoring-approach
minodriven
17
9.3k
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
150
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
1
210
AIキャラアプリkaiwaの低遅延音声通話基盤をどう作ったか - AWS Gravitonで支える低遅延・低コストAI Agent基盤
mogamit
0
180
Featured
See All Featured
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.7k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
370
Speed Design
sergeychernyshev
33
1.9k
How STYLIGHT went responsive
nonsquared
100
6.2k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Everyday Curiosity
cassininazir
0
260
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.7k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
280
Utilizing Notion as your number one productivity tool
mfonobong
4
450
Ethics towards AI in product and experience design
skipperchong
2
330
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.3k
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ͱ͔͍͢͝ΏΔ͍͔Βڵຯ͋ΕͲ͏ͧ
ࠂ • ΞϓϦϦϦʔε • ͘͘ձ
ΞϓϦϦϦʔεʂ • ΞϓϦΛϦϦʔε͠·ͨ͠ਃதͰ͢ • ࠓΘΓͱՋͰ͢ • ̍ޙʹࣄͳ͘ͳΔ͔ɻΑΖ͓͘͠ئ͍͠·͢ɻ
৽ׁ͘͘ձͬͯ·͢ʂ • ݄̏͘Β͍Ͱ༵ʹʮ৽ׁ͘͘ձʯͬͯ· ͢ɻ • ࠷େ໊̔ऩ༰ՄೳɻࢀՃඅແྉʂ • ༵ʹՈʹ͍ͨ͘ͳ͍ਓͥͻ • ଞͷ༵ͷرͥͻ
• ษڧձ։͖͍ͨਓ͝૬ஊ͍ͩ͘͞
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠