Similar documents

2.1 伝統的な非 ARC による Objective-C プログラムの記述例複数のオブジェクトから参照されるオブジェクトは, それを使用中の全てのオブジェクトからの参照がなくなるまで寿命を保たねばならない. オブジェクトの寿命の管理は, オブジェクトを生成した主体が廃棄にも責任を持つ Owners

Lecture 3 Slides (January 12, 2010)

高度なメモリ管理プログラミングガイド ( i 5.1)

TextSystemOverview

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

8 / 0 1 i++ i 1 i-- i C !!! C 2

関数 C 言語は関数の言語 関数とは 関数の定義 : f(x) = x * x ; 使うときは : y = f(x) 戻り値 引数

index View Controller

Javaセキュアコーディングセミナー2013東京第1回 演習の解説

C言語によるアルゴリズムとデータ構造

Microsoft PowerPoint ppt

Prog1_10th

(2) 構造体変数の宣言 文法は次のとおり. struct 構造体タグ名構造体変数名 ; (1) と (2) は同時に行える. struct 構造体タグ名 { データ型変数 1; データ型変数 2;... 構造体変数名 ; 例 : struct STUDENT{ stdata; int id; do

Microsoft PowerPoint - 計算機言語 第7回.ppt

Prog1_15th

Microsoft Word - MDOnline 2001.

C C UNIX C ( ) 4 1 HTML 1

Microsoft PowerPoint - 09.pptx

数はファイル内のどの関数からでも参照できるので便利ではありますが 変数の衝突が起こったり ファイル内のどこで値が書き換えられたかわかりづらくなったりなどの欠点があります 複数の関数で変数を共有する時は出来るだけ引数を使うようにし グローバル変数は プログラムの全体の状態を表すものなど最低限のものに留

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

Microsoft Word - 第5回 基本データ構造2(連結リスト).doc

プログラミング基礎I(再)

2003 Apple Computer, Inc. (Last Updated May 7, 2003)

Taro-リストⅢ(公開版).jtd

カメラ操作のプログラミング(iOS用)について (TP )

SuperH RISC engineファミリ用 C/C++コンパイラパッケージ V.7~V.9 ご使用上のお願い

PowerPoint プレゼンテーション

Taro-リストⅠ(公開版).jtd

Microsoft PowerPoint - lec10.ppt

第3回 配列とリスト

Undestand の解析 Understand の C 言語で抽出できない依存関係について サンプルコードを用いて説明します 確認バージョン Understand 3.0 (Build 640) Understand 3.1 (Build 700) Understand 4.0 (Build 78

関数の動作 / printhw(); 7 printf(" n"); printhw(); printf("############ n"); 4 printhw(); 5 関数の作り方 ( 関数名 ) 戻り値 ( 後述 ) void である. 関数名 (

Ruby演習テキスト1

プログラミング入門1

Microsoft PowerPoint - prog03.ppt

Microsoft Word - no206.docx

情報処理Ⅰ演習

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

Microsoft PowerPoint - ruby_instruction.ppt

void hash1_init(int *array) int i; for (i = 0; i < HASHSIZE; i++) array[i] = EMPTY; /* i EMPTY */ void hash1_insert(int *array, int n) if (n < 0 n >=

JavaプログラミングⅠ


memo

NSDate NSCalendarDate NSObject NSDate NSCalendarDate NSDate NSCalendarDate NSDate NSCalendar NSDate date NSDate *d = [ NSDate date ]; // NSDate : + (i

メディプロ1 Javaプログラミング補足資料.ppt

Javaの作成の前に

Microsoft PowerPoint - prog04.ppt

PowerPoint プレゼンテーション

) CoreImage 2013/5/25 iphone

Prog2_9th

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

Microsoft Word - 13

演習課題No12

PYTHON 資料 電脳梁山泊烏賊塾 PYTHON 入門 関数とメソッド 関数とメソッド Python には関数 (function) とメソッド (method) が有る モジュール内に def で定義されて居る物が関数 クラス内に def で定義されて居る物がメソッドに成る ( 正確にはクラスが

Microsoft PowerPoint ppt

Cコンパイラパッケージお知らせ

Microsoft Word - no202.docx

/* do-while */ #include <stdio.h> #include <math.h> int main(void) double val1, val2, arith_mean, geo_mean; printf( \n ); do printf( ); scanf( %lf, &v

講習No.12

Microsoft PowerPoint - prog07.ppt

プログラミング実習I

GEC-Java

AirPrintPublic

Javaプログラマー早期育成ドリル ~コードリーディング編~ 解答

DVIOUT

DVIOUT

Microsoft PowerPoint L07-Imperative Programming Languages-4-students ( )

file:///D|/C言語の擬似クラス.txt

design_pattern.key

) 2013/7/27 iphone

プログラミングI第10回

Microsoft PowerPoint pptx[読み取り専用]

1.SqlCtl クラスリファレンス SqlCtl クラスのリファレンスを以下に示します メソッドの実行中にエラーが発生した場合は標準エラー出力にメッセージを出力します (1)Connect() メソッド データベースへ connect 要求を行います boolean Connect(String

プログラミング基礎

フローチャート自動生成ツール yflowgen の使い方 目次 1 はじめに 本ツールの機能 yflowgen.exe の使い方 yflowgen.exe の実行方法 制限事項 生成したファイル (gml ファイル形式 ) の開

JEB Plugin 開発チュートリアル 第4回

Java言語 第1回

sp2-2.indd

JavaScriptCore

関数の中で宣言された変数の有効範囲はその関数の中だけです さっきの rectangle _s で宣言されている変数 s は他の関数では使用できません ( 別の関数で同じ名前の変数を宣言することはできますが 全く別の変数として扱われます このように ある関数の中で宣言されている変数のことをその関数の

r08.dvi

memo

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

Prog2_12th

Microsoft Word - Lab5d-DB2組み込みSQL.doc

Prog1_6th

情報工学実験 C コンパイラ第 2 回説明資料 (2017 年度 ) 担当 : 笹倉 佐藤

JAVA入門

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

Prog2_10th

PowerPoint Presentation

情報処理 Ⅱ 2007 年 11 月 26 日 ( 月 )

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

Microsoft PowerPoint - Ruby n

Microsoft PowerPoint ppt

2004/11/23 オブジェクト指向プログラミング - モデル図とシーケンス図の表現方法 - オブジェクト指向プログラミング (OOP:ObjectOrientedPrograming) オブジェクト指向プログラミング言語 (OOPL) Java,C++,Delphi(Pascal),Visual

基本情報STEP UP演習Java対策

C のコード例 (Z80 と同機能 ) int main(void) { int i,sum=0; for (i=1; i<=10; i++) sum=sum + i; printf ("sum=%d n",sum); 2

できるプログラマーを本気で育てる Java 超 Webプログラマーへの第 歩 第 2 回オブジェクト指向 テクノロジックアート 瀬 嘉秀

Transcription:

ARC

Automatic Reference Counting

clang 新しいコンパイラ LLVMプロジェクト (http://llvm.org/) のコンパイラ C Objective-C C++ の効率的なコードを生成 オプションなどは gcc とほぼ共通 Apple社独自の拡張機能を実現 ARC ブロックオブジェクトなど ARCを利用するには clang が必須 コンパイルオプションに -fobjc-arc を指定

簡単な例 変数 a にオブジェクト obj を代入 a = obj; コンパイル [obj retain]; [a release]; a = obj; 挿入されるコード objがnilなら省略され るかもしれない 挿入されるコード autoreleaseかもしれない

どんなコードが挿入される 典型的には 変数へオブジェクトを代入すると 古い値が release さ れ 新しい値が retain されるだろう 自動変数 メソッドや関数内の変数 に代入されていたオ ブジェクトは その自動変数のスコープから抜ける際に release されるだろう メソッド または関数 の引数としてオブジェクトを渡す と 渡す直前に retain され メソッドから戻った後で release されるだろう releaseではなく autorelease が使われることもある 最適化が行われ 冗長な操作は削除される 詳細について知る必要はない

id pool = [[NSAutoreleasePool alloc] init]; a = [[[Volume alloc] init] autorelease]; [pool release];

@autoreleasepool { a = [[Volume alloc] init];

deallocの再定義 - (void)dealloc { [view setdelegate: nil]; [view release]; [filepath release]; [super dealloc]; 後始末のコードが必要 なら記述できる ARCでは インスタンス変数は 自動的に解放される ので 記述しない - (void)dealloc { [view setdelegate: nil]; [view release]; [filepath release]; スーパークラスのdealloc [super dealloc]; は自動的に呼び出される ので記述しない

weak NSString *filepath;

- = unsafe_unretained NSString *path;

@property(strong) NSString *path; @property(weak) NSData *cache; @property(assign) NSWindow *window;

@interface Staff : NSObject @property(strong) Staff *boss; @property(readonly) NSString *name; - (id)initwithname:(nsstring *)str; + (Staff *)staffwithname:(nsstring *)str; - (void)dealloc; - (NSString *)description; @end @implementation Staff { NSString *name; @synthesize boss; @synthesize name;

- (id)initwithname:(nsstring *)str { if ((self = [super init])!= nil) { name = str; boss = nil; return self; + (Staff *)staffwithname:(nsstring *)str { return [[self alloc] initwithname:str]; - (void)dealloc { printf(" release: %s\n",[name UTF8String]); - (NSString *)description { return [NSString stringwithformat:@"name:%@(%@)", name, (boss? boss.name : @"--") ]; @end

int main(void) { Staff *a, *b; @autoreleasepool { a = [Staff staffwithname:@"ann"]; @autoreleasepool { b = [Staff staffwithname:@"bill"]; Staff *c = [Staff staffwithname:@"chris"]; a.boss = b; b.boss = c; printf("%s\n", [[a description] UTF8String]); printf("%s\n", [[b description] UTF8String]); printf("%s\n", [[a description] UTF8String]); printf("%s\n", [[b description] UTF8String]); return 0; Name:Ann (Bill) Name:Bill (Chris) Name:Ann (Bill) Name:Bill (Chris) release: Ann release: Bill release: Chris

a b c int main(void) { Staff *a, *b; @autoreleasepool { a = [Staff staffwithname:@"ann"]; @autoreleasepool { b = [Staff staffwithname:@"bill"]; Staff *c = [Staff staffwithname:@"chris"]; a.boss = b; b.boss = c; printf("%s\n", [[a description] UTF8String]); printf("%s\n", [[b description] UTF8String]); printf("%s\n", [[a description] UTF8String]); printf("%s\n", [[b description] UTF8String]); Name:Ann (Bill) return 0; Name:Bill (Chris) release: Chris Name:Ann (Bill) ゼロ化 bossを弱い参照にすると Name:Bill (--) release: Bill release: Ann

int main(void) { Staff *a, *b; @autoreleasepool { a = [Staff staffwithname:@"ann"]; @autoreleasepool { b = [Staff staffwithname:@"bill"]; Staff *c = [Staff staffwithname:@"chris"]; a.boss = b; b.boss = c; c.boss = a; printf("%s\n", [[a description] UTF8String]); printf("%s\n", [[b description] UTF8String]); printf("%s\n", [[a description] UTF8String]); printf("%s\n", [[b description] UTF8String]); return 0; Name:Ann (Bill) Name:Bill (Chris) Name:Ann (Bill) Name:Bill (Chris)

int main(void) { int i; int (^b[4])(void); 3 3 3 3 for (i = 0; i < 4; i++) b[i] = ^{ return i; ; for (i = 0; i < 4; i++) printf(" %d", b[i]()); putchar('\n'); return 0; 0 1 2 3

struct monster { int x, y; UIImage *image; Creature *attr; ;

( autoreleasing NSError **) + (void)makepartners:(staff * strong [])p

strong weak autoreleasing unsafe_unretained bridge bridge_retained bridge_transfer

bridge CFDataRef d =...; NSData *data = ( bridge NSData *) d; NSString *str =...; CFStringRef s = ( bridge CFStringRef) str; NSData *data =...; void *pointer = ( bridge void *) data;

bridge_retained NSString *str =...; CFStringRef s = ( bridge_retained CFStringRef)str; bridge_transfer CFDataRef d =...; NSData *data = ( bridge_transfer NSData *) d;

Interface Builderでの注意事項 カスタムオブジェクト プログラマが付け加えたオ ブジェクト のアウトレットは基本的に弱い参照に するべきとされている トップレベルのオブ ジェクトは相互に強い 参照をしてもよい トップレベルの オブジェクト