Movatterモバイル変換


[0]ホーム

URL:


Uploaded bymatuura_core
KEY, PPTX2,095 views

Objc lambda

Embed presentation

Download as KEY, PPTX
Objective-C    de  lambda     松浦 明彦    @matu_ani        1
自己紹介• コップ本読んでる途中な程度• 札幌C++勉強会メンバー(最年長w) •   「プログラミングの魔導少女」:巻末記事• 監修メンバー •   「C++の設計と進化」(通称:D&E) •   「ストラウストラップのプログラミング入門」     (通称:鈍器w)• ジャズと酒が趣味、シングルパパです。             2
お話しすること・ねらい• Objective-Cの紹介がてら、関数型つなが りでObjective-Cのラムダ式(Blocks)に ついてお話します。 •   めざせBlocks完全制覇!!• 実装・シンタックス寄り、現場的なお話し です。• 関数型的なお話は殆どありません m(_ _)m                 3
もくじ• Objective-C 文法基礎• Objective-C Blocks基礎• Objective-C Blocks応用• C++とBlocks               4
Objective-C  文法基礎   さらっと流します...        5
Objective-Cとは• C言語にオブジェクト指向機能を追加:☓• Smalltalk風 Object Systemの言語環境にて、C 言語も使うことが出来る:○  • Cの言語仕様自体には、何も足さない何も引かない。                6
Objective-Cとは• C言語にオブジェクト指向機能を追加:☓• Smalltalk風 Object Systemの言語環境にて、C 言語も使うことが出来る:○  • Cの言語仕様自体には、何も足さない何も引かない。 スクリプト言語並の動的言語と静的型付 け言語が共存するハイブリッドな環境                6
Smalltalk 例"initializeメッセージをaMyObjectに送信"aMyObject initialize."引数30のsetSizeメッセージをaSquareに送信"aSquare setSize : 30."オブジェクト「3」にセレクタ「+」を引数「4」で送信"total := 3 + 4.                        7
Objective-Cでのメッセージ送信• メソッド呼び出しは、メッセージ(セ レクタ)送信の結果である。// 単項メッセージ(引数なし)[receiver msg];// receiver->msg(); // 引数付きメッセージval = [receiver msg: arg1 with: arg2];// val = receiver->msg( arg1, arg2 );                      8
Objective-Cでのメッセージ送信• メソッド呼び出しは、メッセージ(セ レクタ)送信の結果である。// 単項メッセージ(引数なし)[receiver msg];// receiver->msg();                          [] で囲う                                   メッセージキーワード // 引数付きメッセージval = [receiver msg: arg1 with: arg2];// val = receiver->msg( arg1, arg2 );                      8
クラスの宣言・定義• クラスの宣言・定義には@コンパイラ ディレクティブを使う。• 通常、宣言部を.hファイル、実装部を.m ファイルに記述する。(一緒でもよい)• #importは#includeと基本同じだが、二 重includeしない。            9
#import <Foundation/Foundation.h>// クラスの宣言@interface MyClass : NSObject {    int val;}- (id)init;+ (void)classMethod:(id)arg; // クラスメソッド- (id)method:(NSObject*)arg1 with:(int)arg2;@end// 実装@implementation MyClass+ (void)classMethod:(id)arg {    // some operation}- (id)method:(NSObject*)arg1 with:(int)args2 {    return obj;}@end                         10
#import <Foundation/Foundation.h>// クラスの宣言@interface MyClass : NSObject {    int val;}- (id)init;+ (void)classMethod:(id)arg; // クラスメソッド- (id)method:(NSObject*)arg1 with:(int)arg2;@end// 実装@implementation MyClass+ (void)classMethod:(id)arg {    // some operation}- (id)method:(NSObject*)arg1 with:(int)args2 {    return obj;}@end                         10
制御構文• if,while,for,とか、JavaやC++と同じ。  AlarmFake* f = [[AlarmFake alloc]init];  if( [f conformsToProtocol:@protocol(Alarm)]   )  {// ・・・ }                      11
基礎編、もうちょい• C/C++との共存• メモリ管理について              12
C/C++との共存• 普通にC/C++が使える。• C++を使う場合、.mでなく、.mmにす る。(ていうか基本.mmにすべし)• boostも使える。• Xcode4.2のllvm-clangはC++11(一 部)も!             13
#import <Foundation/Foundation.h>#include <iostream>#include <boost/shared_ptr.hpp>class CppClass{public:                       C++のクラス! CppClass(){}! void print() const {! ! std::cout << "CppClass::print" << std::endl;! }};@interface ObjcClass : NSObject- (void)print;@end                            Objective-Cのクラス@implementation ObjcClass- (void)print {! NSLog(@"ObjcClass print");}@endvoid boost_test(){! boost::shared_ptr<CppClass> p(new CppClass);!! ObjcClass* oc = [[ObjcClass alloc]init];!! [oc print]; // ObjcClass print! p->print(); // CppClass::print}                             14
メモリ管理• Objective-Cのクラスは静的には生成で  きない。必ずallocする。MyObject* obj = [[MyObject alloc] init];[obj method :arg with:10];                    15
参照カウンタ • 難敵:retain,release,autoreleaseMyObject* obj = [[MyObject alloc] init]; // 参照カウント1[obj retain]; // 参照カウント2NSLog(@"count=%d", [obj retainCount] ); // count=2[obj release] ; // 参照カウント1[obj release] ; // 参照カウント0,開放される・・・// メモリプールが有効なあいだ生きてるMyObject* obj = [[[MyObject alloc] init] autorelease];[obj retain]; // 参照カウント2、メモリプールの生き死に関わらず保持したい!                             16
簡単にリークするw• release忘れ• retainしすぎ• autorelease忘れ• しかも、これらが絡み合うww• ..... Appleが示した解決策は              17
Automatic ReferenceCounting (ARC)• iOS5、MacOSX10.6から• Xcode4.2ではデフォルト• 参照カウンタ管理をコンパイル時に解決し  てくれる。ヽ(^。^)ノ• retain/release/retainCount等は書かなく  ていい。  •   てか、書いたらコンパイルエラー orz• GCとは別(GCもオプションであり)                18
その他の機能•   ランタイムシステム•   プロパティ•   プロトコル•   カテゴリ•   クラスエクステンション•   クラスクラスタ•   例外•   GC•   高速列挙     •   ・・・などなど、あと、フレームワークには一切触れてません                    19
Objective-C  Blocks     20
Blocks基礎   21
Blocksって• ようはラムダです。 •   ラムダ式のリテラル• MacOSX 10.6/iOS 4.0以降• AppleのC言語の拡張 •   http://www.open-std.org/jtc1/sc22/wg14/     www/docs/n1370.pdf                     22
Declaring a Block•   シンタックスはCの関数ポインタと似ている。•   ^ を使う。              23
Using a Blockvoid (^b1)(int) = ^(int x){NSLog(@"Hello Blocks %d",x);};b1(100); // Hello Blocks 100// パラメータ無しなら定義側は()を省略してもOKvoid (^b2)() = ^{NSLog(@"Hello Blocks 2");};b2(); // Hello Blocks 2                            24
パラメータにBlockvoid blocks_caller( void (^f)(void) ){! f();}void blocks_test(){! blocks_caller( ^(){ NSLog(@"test1");} );}                     25
Blocksどーよ• 最近のCocoaAPI は積極的にBlockを 使う傾向にある(iCloud APIとか)。• なんだかんだメモリ管理を意識。 Automatic Reference Counting (ARC) のもとで使うのが良さそう。• 過渡期っぽい.....が、今後は重要なプロ グラミングスタイルと思われ。              26
Blocks応用       といっても、キャプチャとかBlockの寿命とかそのへん          27
変数のキャプチャ• ローカル変数、グローバル変数をBlock 内で使用可能• ローカル変数はデフォルトで、イミュー タブル、かつBlock構築時のコピー          28
キャプチャの例int g=999; // グローバル変数・・・int x = 100;void (^b)() = ^(){NSLog(@"x=%d g=%d",x,g);};b(); // x=100 g=999x=200;b(); // x=100(変わらず)g=888;b(); // x=100 g=888                      29
ミュータブルで共有なキャ プチャ__block int x=100;void (^b)() = ^(){NSLog(@"x=%d g=%d", x++, g);};b(); // x=100 g=999b(); // x=101 g=999x=200;b(); // x=200 g=999                      30
クラスで使う     @interface testClass : NSObject{         int x_;     }     -(void) myprint;     -(void) print:(void(^)(int x))printer;     @end     @implementation testClass     -(void)print:(void (^)(int x))printer {         printer(x_);      }testClass* t = [[testClass alloc]init];[t print:^(int x){ NSLog(@"my printer x=%d", x);}];                        31
selfのキャプチャ-(void)myprint { // testClassのメソッド    x_ = 100;    void(^b)()=^{ NSLog(@"x_=%d", x_);};    b(); // x_ = 100    x_ = 200;    b(); // x_ = 200 !!(コピーと違うの??)    // こう書いているのと同じ    void(^b2)()=^{ NSLog(@"testClass x_=%d", self->x_);};}    • メンバー変数がキャプチャされているのではない    • selfがキャプチャされている!                           32
高階関数、部分適用C#Func<int, Func<int, int>> f = x => y => x + y;Func<int, int> fc = f(1);int x = fc(3); // 4 (1 + 3)C++11auto f = [](int x){ return [x](int y){return x+y;}; };auto fc = f(1);int x = fc(3); // 4 (1 + 3)                          33
Blockだと。。void blocks_test(){! typedef int (^add_function)(int);! add_function (^f)(int) =! ! ! ! ! ^(int x){! ! ! ! ! ! return Block_copy(^(int y){ return x+y;});! !   ! ! ! };! add_function fc = f(1);! NSLog(@"blocks_test() fc=%d", fc(3)); // 4 (1 + 3)! Block_release(fc);}                             34
Blocks大事なこと• Blockの生存期間はそのスタックと同じ。• スタック外で使うならコピーが必要。 •   Block_copy / Block_release •   ただ、コピーしなくてもコンパイル通る(事が多い)し、     動くから恐ろしい。• ARCのもとでは Block_copy / Block_release 不要。 •   てかコンパイルエラーになる                          35
ARCありなら...void blocks_test(){! typedef int (^add_function)(int);! add_function (^f)(int) =                 ^(int x){return ^(int y){return x+y;};};! add_function fc = f(1);! NSLog(@"blocks_test() fc=%d", fc(3)); // 4 (1 + 3)}                  すっきり(^^)                           36
軽くまとめ• ローカル変数のキャプチャはデフォルトで イミュータブルかつBlock構築時のコピー。• __block修飾されたローカル変数は、ミュー タブルとなり、そのスタック内のblockで共 有される。• Blockの寿命はスタックと同じ。スタック外 でも使いたければcopyが必要。• ARCが吉           37
BlocksとC++ 実はここを一番話したかったという噂もw...           38
C++11のfunction<T>   にBlockをstd::function<void(int)> f            = ^(int x){NSLog(@"Hello function!! x=%d",x);};f(1); // Hello function!! x=1f(2); // Hello function!! x=2 std::function<T>は、Blocks対応に書き換え てあるのかな??                            39
簡易function作ったtemplate<typename R, typename ...V>struct my_function {    struct HolderBase{        virtual R run(V... arg)=0;    };    template<typename F>    struct Holder : HolderBase {        F f_;        Holder(F f):f_(f){}        virtual R run(V... arg) {            return f_(arg...);        }    };    boost::scoped_ptr<HolderBase> holder_;     template<typename F>     my_function(F f) : holder_(new Holder<F>(f) ){}     R operator()(V... arg) {         holder_->run(arg...);     }};                         40
my_functionにもmy_function<void,int> mf(^(int x){NSLog(@"my_function!! x=%d",x);});mf(100); // my_function!! x=100      • my_functionにBlocks固有のコードは無い。      • BlocksはObjC固有の型だが、C++のジェネリッ         ク型システムはそれを吸収した(とも言えるか         と)。      • 無論、std::functionは変更不要               (のはず) 。                                  41
C++11 autoで型推論// blockをautoで型推論auto af = ^(int x){NSLog(@"Hello C++11 auto!! x=%d",x);};af(5); // Hello C++11 auto!! x=5// 高階関数も楽チンauto f = ^(int x){ return ^(int y){ return x+y;};};auto fc = f(1);NSLog(@"Hello C++11 auto!! fc=%d",fc(3)); // fc=4                           42
C++11 autoで型推論// blockをautoで型推論auto af = ^(int x){NSLog(@"Hello C++11 auto!! x=%d",x);};af(5); // Hello C++11 auto!! x=5// 高階関数も楽チンauto f = ^(int x){ return ^(int y){ return x+y;};};auto fc = f(1);NSLog(@"Hello C++11 auto!! fc=%d",fc(3)); // fc=4    やっぱC++かわいいw                           42
ご清聴ありがとうございました     43

Recommended

PDF
組み込みでこそC++を使う10の理由
PPTX
Visual C++で使えるC++11
PDF
C++14 Overview
PPTX
BoostAsioで可読性を求めるのは間違っているだろうか
PDF
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
PDF
ゲーム開発者のための C++11/C++14
PDF
unique_ptrにポインタ以外のものを持たせるとき
PPTX
競技プログラミングのためのC++入門
PPTX
C# 9.0 / .NET 5.0
PDF
クロージャデザインパターン
PDF
中3女子が狂える本当に気持ちのいい constexpr
PDF
知って得するC#
PDF
SEH on mingw32
PPTX
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
PDF
新しい並列for構文のご提案
 
PDF
不遇の標準ライブラリ - valarray
PDF
Effective Modern C++ 読書会 Item 35
PPTX
C# 8.0 null許容参照型
PPTX
Map
PDF
C++ ポインタ ブートキャンプ
PDF
JavaScript 講習会 #1
 
PPTX
.NET Core 2.x 時代の C#
PDF
C++ Template Meta Programming の紹介@社内勉強会
PDF
Emcjp item21
PPTX
LINQ 概要 + 結構便利な LINQ to XML
PDF
C++入門?
 
KEY
連邦の白いヤツ 「Objective-C」
PDF
Essence of the iterator pattern

More Related Content

PDF
組み込みでこそC++を使う10の理由
PPTX
Visual C++で使えるC++11
PDF
C++14 Overview
PPTX
BoostAsioで可読性を求めるのは間違っているだろうか
PDF
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
PDF
ゲーム開発者のための C++11/C++14
PDF
unique_ptrにポインタ以外のものを持たせるとき
組み込みでこそC++を使う10の理由
Visual C++で使えるC++11
C++14 Overview
BoostAsioで可読性を求めるのは間違っているだろうか
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
ゲーム開発者のための C++11/C++14
unique_ptrにポインタ以外のものを持たせるとき

What's hot

PPTX
競技プログラミングのためのC++入門
PPTX
C# 9.0 / .NET 5.0
PDF
クロージャデザインパターン
PDF
中3女子が狂える本当に気持ちのいい constexpr
PDF
知って得するC#
PDF
SEH on mingw32
PPTX
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
PDF
新しい並列for構文のご提案
 
PDF
不遇の標準ライブラリ - valarray
PDF
Effective Modern C++ 読書会 Item 35
PPTX
C# 8.0 null許容参照型
PPTX
Map
PDF
C++ ポインタ ブートキャンプ
PDF
JavaScript 講習会 #1
 
PPTX
.NET Core 2.x 時代の C#
PDF
C++ Template Meta Programming の紹介@社内勉強会
PDF
Emcjp item21
PPTX
LINQ 概要 + 結構便利な LINQ to XML
PDF
C++入門?
 
競技プログラミングのためのC++入門
C# 9.0 / .NET 5.0
クロージャデザインパターン
中3女子が狂える本当に気持ちのいい constexpr
知って得するC#
SEH on mingw32
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
新しい並列for構文のご提案
 
不遇の標準ライブラリ - valarray
Effective Modern C++ 読書会 Item 35
C# 8.0 null許容参照型
Map
C++ ポインタ ブートキャンプ
JavaScript 講習会 #1
 
.NET Core 2.x 時代の C#
C++ Template Meta Programming の紹介@社内勉強会
Emcjp item21
LINQ 概要 + 結構便利な LINQ to XML
C++入門?
 

Viewers also liked

KEY
連邦の白いヤツ 「Objective-C」
PDF
Essence of the iterator pattern
PDF
Iterator Pattern
PDF
SPL fukuokaphp_1
PPTX
The Essence of the Iterator Pattern
PDF
型! 型!
KEY
Matuura cpp
PPTX
Chakkason.pptx
連邦の白いヤツ 「Objective-C」
Essence of the iterator pattern
Iterator Pattern
SPL fukuokaphp_1
The Essence of the Iterator Pattern
型! 型!
Matuura cpp
Chakkason.pptx

Similar to Objc lambda

PDF
C++コミュニティーの中心でC++をDISる
PDF
Pfi Seminar 2010 1 7
PDF
第2回勉強会スライド
PDF
Processing
PDF
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1
PDF
Cocos2d xをさらにさわってみよう!
PDF
C++ lecture-0
PDF
Objectie-C de ラムダ
PDF
20120422i phonedeveloperworkshoppublished
PDF
研究生のためのC++ no.2
KEY
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
PDF
Cocoa勉強会#43-Blocksを使う
PDF
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 2
DOCX
Boost勉強会 #10 ディスカッションまとめ
PDF
GCをみればRTSが見えてくる、かも。。。
 
PDF
24時間でiOSアプリ-Twitterクライアント-の作成にチャレンジ
PPT
"Formalizing Architectural Connection" 紹介
PDF
Obj c
PDF
iPhone, iPad アプリ開発勉強会#3
PDF
I phoneアプリ入門 第5回
C++コミュニティーの中心でC++をDISる
Pfi Seminar 2010 1 7
第2回勉強会スライド
Processing
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1
Cocos2d xをさらにさわってみよう!
C++ lecture-0
Objectie-C de ラムダ
20120422i phonedeveloperworkshoppublished
研究生のためのC++ no.2
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
Cocoa勉強会#43-Blocksを使う
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 2
Boost勉強会 #10 ディスカッションまとめ
GCをみればRTSが見えてくる、かも。。。
 
24時間でiOSアプリ-Twitterクライアント-の作成にチャレンジ
"Formalizing Architectural Connection" 紹介
Obj c
iPhone, iPad アプリ開発勉強会#3
I phoneアプリ入門 第5回

Recently uploaded

PDF
2026magazine tour tabisentsunagu たびせんつなぐ
PDF
2212slide.pdf
PDF
1ページでわかるTAPP_20251211________________
PDF
【会社紹介資料】 株式会社カンゲンエージェント [ 11 月 30 日作成資料公開 ].pdf
PDF
SNS_Marketing_Company_ナハトエース会社説明資料_2025/12/10_SlideShare.pdf
PDF
slideshare_ナハトエース会社説明資料_2025/12/11_SlideShare.pdf
2026magazine tour tabisentsunagu たびせんつなぐ
2212slide.pdf
1ページでわかるTAPP_20251211________________
【会社紹介資料】 株式会社カンゲンエージェント [ 11 月 30 日作成資料公開 ].pdf
SNS_Marketing_Company_ナハトエース会社説明資料_2025/12/10_SlideShare.pdf
slideshare_ナハトエース会社説明資料_2025/12/11_SlideShare.pdf

Objc lambda

Editor's Notes


[8]ページ先頭

©2009-2025 Movatter.jp