狠狠撸

狠狠撸Share a Scribd company logo
Objective-C
- atomicity -
Objective-C
- atomicity -
?~ 誰もが知ってるかもしれない最初の話 ?~?~ 誰もが知ってるかもしれない最初の話 ?~
EZ-‐??NET ?熊?谷友宏 @EasyStyleGK
http://program.station.ez-‐??net.jp/
今回は、ここのお话
?自?己紹介
@EasyStyleGK
EZ-‐??NET ?IP ?Phone ?音で再配達ゴッド
?音で再配達 ?音でダイヤル いつもの電卓
for ?iPad
いつもの電卓
for ?iPhone
iOS ?アプリ
制作中
iOS ?アプリ
制作中
EZ-‐??NET ?熊?谷友宏
http://program.station.ez-‐??net.jp/
はじまり
1. nonatomic ?ってなんだろう
2. なぜ今頃 atomic ?の話題なのか
3. @property (atomic)って何をしてくれるの?
4. 値が壊れる?
5. スレッドセーフを考慮する
1. nonatomic ?ってなんだろう
2. なぜ今頃 atomic ?の話題なのか
3. @property (atomic)って何をしてくれるの?
4. 値が壊れる?
5. スレッドセーフを考慮する
?目次?目次
第1章
nonatomic って
なんだろう
nonatomic って
なんだろう
nonatomic ?と?言えば
1. プロパティ定義で使うキーワード
2. atomic ?と nonatomic ?とがある
3. 省省略略時は atomic ?になる
1. プロパティ定義で使うキーワード
2. atomic ?と nonatomic ?とがある
3. 省省略略時は atomic ?になる
そのプロパティが原?子性を
保証するかを?示すキーワード
そのプロパティが原?子性を
保証するかを?示すキーワード
原?子性とは
これ以上分解できない単位これ以上分解できない単位
つまり atomic ?なプロパティとは
そのプロパティの処理理を
ひとまとまりとして実?行行する
そのプロパティの処理理を
ひとまとまりとして実?行行する
ということ?ということ?
つまり atomic ?なプロパティとは
つまりスレッドセーフ
ということ?
つまりスレッドセーフ
ということ?
必ずしもそうとは限らない必ずしもそうとは限らない
第2章
なぜ今頃
atomic の話題なのか
なぜ今頃
atomic の話題なのか
それは無計画さが招いた課題
1. EXC_?BAD_?ACCESS ?で落落ちる
2. 計算中に結果を取得される
3. 状態に基づく処理理中に状態が変わる
1. EXC_?BAD_?ACCESS ?で落落ちる
2. 計算中に結果を取得される
3. 状態に基づく処理理中に状態が変わる
?自作アプリの複数スレッドを跨ぐ処理理が
いよいよ制御しきれなくなったため!
?自作アプリの複数スレッドを跨ぐ処理理が
いよいよ制御しきれなくなったため!
スレッドセーフを考えなくてはいけないスレッドセーフを考えなくてはいけない
スレッドセーフってなんだろう
1. 他スレッドで使?用中のインスタンスが
解放されないようにする
2. 複数スレッドからのアクセス時に、
値に?矛盾が出ない事を保証する
3. ?一連の処理理をブロックして、?矛盾のな
い処理理を保証する
1. 他スレッドで使?用中のインスタンスが
解放されないようにする
2. 複数スレッドからのアクセス時に、
値に?矛盾が出ない事を保証する
3. ?一連の処理理をブロックして、?矛盾のな
い処理理を保証する
など、いろいろなど、いろいろ
スレッドセーフというのは
atomic ?はそのうちのひとつatomic ?はそのうちのひとつ
複数スレッドを使った平?行行処理理を
?矛盾しないように制御する考え?方
複数スレッドを使った平?行行処理理を
?矛盾しないように制御する考え?方
第3章
@property (atomic) って
何をしてくれるの?
@property (atomic) って
何をしてくれるの?
それとも?自分で原?子性を
保証しなければいけないの?
それとも?自分で原?子性を
保証しなければいけないの?
原?子性をコンパイラが
?自動で保証してくれるの?
原?子性をコンパイラが
?自動で保証してくれるの?
プロパティに atomic ?を指定したとき
@synthesize ?であれば
ある程度度は?自動で保証してくれる
@synthesize ?であれば
ある程度度は?自動で保証してくれる
このあたりの感覚は
@property ?(copy) ?と同じ
このあたりの感覚は
@property ?(copy) ?と同じ
@synthesize ?での atomic ?制御
読み書きする値が
正しいことを保証する
読み書きする値が
正しいことを保証する
1. インスタンス変数に書き込んでいる間、
他からの読み書きはブロックされる
1. インスタンス変数に書き込んでいる間、
他からの読み書きはブロックされる
プリミティブ型の場合プリミティブ型の場合
@synthesize ?での atomic ?制御
値の正確性と合わせて
インスタンスの?生存を保証する
値の正確性と合わせて
インスタンスの?生存を保証する
1. インスタンス変数に書き込んでいる間、
他からの読み書きはブロックされる
2. ゲッターでは、ブロックの中でインスタ
ンスを retain ?して autorelease ?する
1. インスタンス変数に書き込んでいる間、
他からの読み書きはブロックされる
2. ゲッターでは、ブロックの中でインスタ
ンスを retain ?して autorelease ?する
オブジェクト型の場合オブジェクト型の場合
@synthesize ?での atomic ?制御
@synthesize ?で保証されるのは
該当する ivar ?の整合性だけ
@synthesize ?で保証されるのは
該当する ivar ?の整合性だけ
インスタンス全体の
整合性は保証されない
インスタンス全体の
整合性は保証されない
オブジェクト全体の整合性を保証したいなら
A. 同時実?行行されたくないもの同?士をロック
B. クラスを Immutable ?で設計する
C. インスタンスを扱うスレッドを統?一する
A. 同時実?行行されたくないもの同?士をロック
B. クラスを Immutable ?で設計する
C. インスタンスを扱うスレッドを統?一する
メソッドでの処理理も考慮した
インスタンス全体の整合性を保つ制御が必要
メソッドでの処理理も考慮した
インスタンス全体の整合性を保つ制御が必要
こういったことに配慮しながら
クラスを設計する必要がある
こういったことに配慮しながら
クラスを設計する必要がある
第4章
値が壊れる?値が壊れる?
同時アクセスされることで
クラス全体の整合性が
崩れることは想像に易易しい
クラス全体の整合性が
崩れることは想像に易易しい
case ?1:case ?1:
インスタンス
{
int _?a;
int _?b;
}
-‐?? (void)setA:(int)a ?B:(int)b
{
_?a = ?a;
_?b = ?b;
}
-‐?? (int)total
{
return _?a + ?_?b;
}
{
int _?a;
int _?b;
}
-‐?? (void)setA:(int)a ?B:(int)b
{
_?a = ?a;
_?b = ?b;
}
-‐?? (int)total
{
return _?a + ?_?b;
}
クラス全体の整合性破壊
スレッド 1
スレッド 2
[obj ?setA:3 ?B:5];[obj ?setA:3 ?B:5];
6
[obj ?setA:1 ?B:3];[obj ?setA:1 ?B:3];
[obj ?total];[obj ?total];a ?? ?1
[3]
b ??
3
[5]
4
a ?? ?3
[1]
b ??
5
[2]
8
? 1 ?
+ ?5
[4]
?
同時アクセスされることで
@synthesize ?なプロパティが
壊れるってどういうこと?
@synthesize ?なプロパティが
壊れるってどういうこと?
case ?2:case ?2:
インスタンス
{
long ?long ?_?val;
}
-‐?? (void)setVal:(long ?long)val
{
_?val = ?val;
}
-‐?? (long ?long)val
{
return _?val;
}
{
long ?long ?_?val;
}
-‐?? (void)setVal:(long ?long)val
{
_?val = ?val;
}
-‐?? (long ?long)val
{
return _?val;
}
プロパティの整合性破壊?
スレッド 1
スレッド 2
obj.val ?= ?1;obj.val ?= ?1;
4294967295
1
-‐??1
obj.val ?= ?-‐??1obj.val ?= ?-‐??1
obj.val;obj.val;
!?_?val ? ?-‐??1
[2]
_?val ? ?1
[1]
? -‐??1[3]
プロパティの整合性破壊…
プログラムの1?行行が
実?行行時の1ステップではない
プログラムの1?行行が
実?行行時の1ステップではない
インスタンス
{
long ?long ?_?val;
}
-‐?? (void)setVal:(long ?long)val
{
_?val = ?val;
}
-‐?? (long ?long)val
{
return _?val;
}
{
long ?long ?_?val;
}
-‐?? (void)setVal:(long ?long)val
{
_?val = ?val;
}
-‐?? (long ?long)val
{
return _?val;
}
プロパティの整合性破壊!
スレッド 1
スレッド 2
obj.val ?= ?1;obj.val ?= ?1;
4294967295
obj.val ?= ?-‐??1obj.val ?= ?-‐??1
obj.val;obj.val;
下位ビット
[3]
上位
ビット
[6]
-‐??1
下位ビット
[1]
上位
ビット
[2]
1
下位ビット
[4]
上位
ビット
[5]
!
同時アクセスされることで
プリミティブ型だって壊れるプリミティブ型だって壊れる
つまりつまり
もちろん構造体も壊れるもちろん構造体も壊れる
同時アクセスされることで
インスタンスが
解放されることも
インスタンスが
解放されることも
case ?3:case ?3:
インスタンス
@interface ?MyClass
{
NSString* ?_?string;
}
@property ?(nonatomic,readwrite,rcopy) ? NSString* ?string;
@end
@implementation MyClass
@synthesize ?string ?= _?string;
@end
@interface ?MyClass
{
NSString* ?_?string;
}
@property ?(nonatomic,readwrite,rcopy) ? NSString* ?string;
@end
@implementation MyClass
@synthesize ?string ?= _?string;
@end
インスタンスの予期しない解放
スレッド 1
スレッド 2
string ?= ?[obj.string ?retain];string ?= ?[obj.string ?retain];
[string retain]
[3]
Bad ?Access ?!
? ?
_?string
[1]
[_?string ?
release]
[2]
_?string ?= ?
[ssss copy]
[4]
obj.string ?= ?ssss;obj.string ?= ?ssss;
平?行行処理理は危険がいっぱい平?行行処理理は危険がいっぱい
スレッドセーフってとっても?大事スレッドセーフってとっても?大事
第5章
スレッドセーフを考慮するスレッドセーフを考慮する
おさらい
同時アクセスが引き起こす不不都合同時アクセスが引き起こす不不都合
A. プリミティブ型のプロパティが扱うデー
タが壊れる
B. プロパティから取得したオブジェクトが
予期せず解放される
C. インスタンスへの同時アクセスにより
その整合性が崩れる
A. プリミティブ型のプロパティが扱うデー
タが壊れる
B. プロパティから取得したオブジェクトが
予期せず解放される
C. インスタンスへの同時アクセスにより
その整合性が崩れる
スレッドセーフの実現?方法
同時アクセスによる
不不都合からプログラムを守るために
同時アクセスによる
不不都合からプログラムを守るために
A. atomic ?と @synthesize ?を使?用する
B. 返すインスタンスは確実に retain ?する
C. 関係する範囲を把握して
不不整合が起こらないようにロックする
D. 実?行行するスレッドをひとつに統?一する
E. クラスを Immutable ?で設計する
A. atomic ?と @synthesize ?を使?用する
B. 返すインスタンスは確実に retain ?する
C. 関係する範囲を把握して
不不整合が起こらないようにロックする
D. 実?行行するスレッドをひとつに統?一する
E. クラスを Immutable ?で設計する
同時アクセスからの保護
実例例をいくつか実例例をいくつか
ブロックの?方法
Objective-‐??C ?で使えるロックの紹介Objective-‐??C ?で使えるロックの紹介
a) @synchronized ?(self)
― ?続くブロック {} ?を再帰ロック
― ?指定したインスタンスがキーになる
b) NSRecursiveLock
― ?-‐??lock ?から -‐??unlock ?までを再帰ロック
― ?pthread_?mutex ?の Objective-‐??C ?版
c) セマフォ
― ?dispatch_?semaphore ?でロック
― ?タイムアウトの指定も可能
a) @synchronized ?(self)
― ?続くブロック {} ?を再帰ロック
― ?指定したインスタンスがキーになる
b) NSRecursiveLock
― ?-‐??lock ?から -‐??unlock ?までを再帰ロック
― ?pthread_?mutex ?の Objective-‐??C ?版
c) セマフォ
― ?dispatch_?semaphore ?でロック
― ?タイムアウトの指定も可能
実例例
読み書きでの
値の破壊を防ぐ
読み書きでの
値の破壊を防ぐ
case ?A:case ?A:
読み書きでの値の破壊を防ぐ
プリミティブ型の @property ?(atomic) ?を
@synthesize ?したときに採られる?方法
プリミティブ型の @property ?(atomic) ?を
@synthesize ?したときに採られる?方法
1. セッターとゲッターを
同じキーでロックする
1. セッターとゲッターを
同じキーでロックする
同時アクセスを防ぎ
値の?矛盾を起こさない
同時アクセスを防ぎ
値の?矛盾を起こさない
インスタンス
@interface ?MyObject : ?NSObject
{
long ?long ?_?val;
}
@property ?(atomic,readwrite) ?long ?long val;
@end
@implementation MyObject
@synthesize ?val ?= ?_?val;
@end
@interface ?MyObject : ?NSObject
{
long ?long ?_?val;
}
@property ?(atomic,readwrite) ?long ?long val;
@end
@implementation MyObject
@synthesize ?val ?= ?_?val;
@end
atomic ?キーワードを使?用する
スレッド 1
スレッド 2
obj.val = ?1;obj.val = ?1;
-‐??1
obj.val ?= ?-‐??1obj.val ?= ?-‐??1
obj.val;obj.val;
下位ビット
[2]
上位
ビット
[2]
-‐??1
下位ビット
[1]
上位
ビット
[1]
1
下位ビット
[3]
上位
ビット
[3]
Lock!Lock!
Lock!Lock!
Lock!Lock!
OK
!
内部的な実装は次のような感じに
@synthesize ?で?生成される内部ロックは
@synchronized ?(self) ?とはまったく別のもの
@synthesize ?で?生成される内部ロックは
@synchronized ?(self) ?とはまったく別のもの
Setter
-‐?? (void)setVal:(long ?long)val
{
[_?lock ?lock];
_?val = ?val;
[_?lock ?unlock];
}
-‐?? (void)setVal:(long ?long)val
{
[_?lock ?lock];
_?val = ?val;
[_?lock ?unlock];
}
Getter
-‐?? (long ?long)val
{
[_?lock ?lock];
@try
{
return _?val;
}
@finally
{
[_?lock ?unlock];
}
}
-‐?? (long ?long)val
{
[_?lock ?lock];
@try
{
return _?val;
}
@finally
{
[_?lock ?unlock];
}
}
実例例
インスタンスを
確実に retain ?する
インスタンスを
確実に retain ?する
case ?B:case ?B:
インスタンスを確実に retain ?する
1. セッターとゲッターを
同じキーでロックする
2. ゲッターのロック内でインスタンス
を retain ?& ?autorelease ?する
1. セッターとゲッターを
同じキーでロックする
2. ゲッターのロック内でインスタンス
を retain ?& ?autorelease ?する
インスタンスを確実に確保して
呼び出し元が正しく受け取れるようにする
インスタンスを確実に確保して
呼び出し元が正しく受け取れるようにする
オブジェクト型の @property ?(atomic) ?を
@synthesize ?したときに採られる?方法
オブジェクト型の @property ?(atomic) ?を
@synthesize ?したときに採られる?方法
インスタンス
@interface ?MyClass
{
NSString* ?_?string;
}
@property ?(atomic,readwrite,copy) ?NSString* string;
@end
@implementation MyClass
@synthesize ?string ?= _?string;
@end
@interface ?MyClass
{
NSString* ?_?string;
}
@property ?(atomic,readwrite,copy) ?NSString* string;
@end
@implementation MyClass
@synthesize ?string ?= _?string;
@end
インスタンスを確実に retain ?する
スレッド 1
スレッド 2
string ?= ?[obj.string ?retain];string ?= ?[obj.string ?retain];
[_?string ?
release]
[2]
_?string ?= ?
[ssss retain]
[2]
obj.string ?= ?ssss;obj.string ?= ?ssss;
[string ?retain]
[3]
[_?string ?
retain]
[1]
[_?string ?
autorelease]
[1]
? ?_?string[1]
Lock!Lock!
Lock!Lock!
KEEP!
OK
!
内部的な実装は次のような感じに
親インスタンスの dealloc ?で _?string ?が
解放されるところまでは保護されない
親インスタンスの dealloc ?で _?string ?が
解放されるところまでは保護されない
Setter
-‐?? (void)setString:
(NSString*)string
{
[_?lock ?lock];
_?string = ?[string ?copy];
[_?lock ?unlock];
}
-‐?? (void)setString:
(NSString*)string
{
[_?lock ?lock];
_?string = ?[string ?copy];
[_?lock ?unlock];
}
Getter
-‐?? (NSString*)string
{
[_?lock ?lock];
@try
{
[_?string retain];
[_?string autorelease];
return _?string;
}
@finally
{
[_?lock ?unlock];
}
}
-‐?? (NSString*)string
{
[_?lock ?lock];
@try
{
[_?string retain];
[_?string autorelease];
return _?string;
}
@finally
{
[_?lock ?unlock];
}
}
実例例
関係する範囲をロックして
不不整合が起きないようにする
関係する範囲をロックして
不不整合が起きないようにする
case ?C:case ?C:
関係する範囲をロックして不不整合を防ぐ
1. 同時アクセスされたくない部分を
同じキーでロックする
2. プロパティも含めて保護するときは
@synthesize ?は使わない
1. 同時アクセスされたくない部分を
同じキーでロックする
2. プロパティも含めて保護するときは
@synthesize ?は使わない
計算処理理と結果取得を同じキーでロックすれば
計算途中の結果取得を防?止できる
計算処理理と結果取得を同じキーでロックすれば
計算途中の結果取得を防?止できる
オブジェクト全体の
整合性を保護する?方法
オブジェクト全体の
整合性を保護する?方法
インスタンス
-‐?? (void)setA:(int)a ?B:(int)b
{
@synchronized ?(self)
{
_?a = ?a;
_?b = ?b;
}
}
-‐?? (int)total
{
@synchronized ?(self)
{
return _?a + ?_?b;
}
}
-‐?? (void)setA:(int)a ?B:(int)b
{
@synchronized ?(self)
{
_?a = ?a;
_?b = ?b;
}
}
-‐?? (int)total
{
@synchronized ?(self)
{
return _?a + ?_?b;
}
}
整合性に関係する範囲をロックする
スレッド 1
スレッド 2
[obj ?setA:3 ?B:5];[obj ?setA:3 ?B:5];
4
[obj ?setA:1 ?B:3];[obj ?setA:1 ?B:3];
[obj ?total];[obj ?total];
a ?? ?1
[2]
b ??
3
[2]
4
a ?? ?3
[1]
b ??
5
[1]
8
? 1 ?
+ ?3
[3]
Lock!Lock!
Lock!Lock!
Lock!Lock!
OK
!
実例例
実?行行するスレッドを
ひとつに統?一する
実?行行するスレッドを
ひとつに統?一する
case ?D:case ?D:
実?行行するスレッドをひとつに統?一する
1. ある?一連の機能を必ず同じスレッド
で実?行行するようにする
2. 実?行行スレッドではランループが必要
1. ある?一連の機能を必ず同じスレッド
で実?行行するようにする
2. 実?行行スレッドではランループが必要
同時アクセスを起こさせないため
ロックやデータの?矛盾を気にしなくて済む
同時アクセスを起こさせないため
ロックやデータの?矛盾を気にしなくて済む
iOS の UI ?制御でも採られている?方法iOS の UI ?制御でも採られている?方法
インスタンス
@interface ?MyClass
{
NSString* ?_?string;
}
@property ?(nonatomic,readwrite,copy) ?NSString* string;
@end
@implementation MyClass
@synthesize ?string = _?string;
@end
@interface ?MyClass
{
NSString* ?_?string;
}
@property ?(nonatomic,readwrite,copy) ?NSString* string;
@end
@implementation MyClass
@synthesize ?string = _?string;
@end
実?行行するスレッドをひとつに統?一する
スレッド 1
スレッド 2
string ?= ?[obj.string ?retain];string ?= ?[obj.string ?retain];
[string ?retain]
[2]
[_?string ?
release]
[3]
_?string ?= ?
[ssss copy]
[4]
[obj ?performSelector:@selector(setString:)
onThread:スレッド2
withObject:ssss
waitUntilDone:NO];
[obj ?performSelector:@selector(setString:)
onThread:スレッド2
withObject:ssss
waitUntilDone:NO];
No Lock.No Lock.
? ?
_?string
[1]
OK
!
実例例
クラスを
Immutable ?で設計する
クラスを
Immutable ?で設計する
case ?E:case ?E:
クラスを Immutable ?で設計する
インスタンス?生成後に
値を変更更できないようにする?方法
インスタンス?生成後に
値を変更更できないようにする?方法
値が「変化する途中」が存在しないため
同時アクセスで値が?矛盾しない
値が「変化する途中」が存在しないため
同時アクセスで値が?矛盾しない
1. インスタンス?生成後に ivar ?の値を編集
できないクラスを作る
2. 値の設定はインスタンス?生成のときだけ
1. インスタンス?生成後に ivar ?の値を編集
できないクラスを作る
2. 値の設定はインスタンス?生成のときだけ
クラスを Immutable ?で設計する
ただしインスタンスの受け渡し時には
原?子性を保護する必要がある
ただしインスタンスの受け渡し時には
原?子性を保護する必要がある
Immutable ?クラスの特徴Immutable ?クラスの特徴
内部でのロックなく
複数スレッドで使?用可能
内部でのロックなく
複数スレッドで使?用可能
クラスを Immutable ?で設計する
値は init ?メソッドで設定して
インスタンス?生成後は値の取得だけができる
値は init ?メソッドで設定して
インスタンス?生成後は値の取得だけができる
クラス定義
@interface MyClass ?: ?NSObject
@property ?(nonatomic,readonly) ?long ?long a;
@property (nonatomic,readonly) ?long ?long b;
@property (nonatomic,readonly) ?long ?long ?total;
-‐?? (id)initWithA:(long ?long)a ?B:(long ?long)b;
@end
@interface MyClass ?: ?NSObject
@property ?(nonatomic,readonly) ?long ?long a;
@property (nonatomic,readonly) ?long ?long b;
@property (nonatomic,readonly) ?long ?long ?total;
-‐?? (id)initWithA:(long ?long)a ?B:(long ?long)b;
@end
クラスを Immutable ?で設計する
クラス実装
@implementation ?MyClass
-‐?? (id)initWithA:(long ?long)a ?B:(long ?long)b
{
self ?= ?[super ?init];
if (self)
{
_?a = ?a;
_?b = ?b;
}
return self;
}
-‐?? (long ?long)total
{
return _?a + ?_?b;
}
@implementation ?MyClass
-‐?? (id)initWithA:(long ?long)a ?B:(long ?long)b
{
self ?= ?[super ?init];
if (self)
{
_?a = ?a;
_?b = ?b;
}
return self;
}
-‐?? (long ?long)total
{
return _?a + ?_?b;
}
インスタンス
@interface ?TestClass
{
MyClass* ?_?obj;
}
@property ?(atomic,readwrite,retain) ? MyClass* ?obj;
@end
@implementation MyClass
@synthesize ?obj = _?obj;
@end
@interface ?TestClass
{
MyClass* ?_?obj;
}
@property ?(atomic,readwrite,retain) ? MyClass* ?obj;
@end
@implementation MyClass
@synthesize ?obj = _?obj;
@end
クラスを Immutable ?で設計する
スレッド 1
スレッド 2
test.obj = ?[[MyClass ?alloc] ?initWithA:3 ?B:5];test.obj = ?[[MyClass ?alloc] ?initWithA:3 ?B:5];
4
test.obj = ?[[MyClass ?alloc] ?initWithA:1 ?B:3];test.obj = ?[[MyClass ?alloc] ?initWithA:1 ?B:3];
[test.obj total];[test.obj total];
_?obj ?= ?
[obj ?retain]
[2]4
_?obj ?= ?
[obj ?retain]
[1]8
[_?obj ?
retain]
[3]
[_?obj ?
autorelease]
[3]
? ?_?obj[3]
Lock!Lock!
[test.obj total]
[2]
Lock!Lock!
Lock!Lock!
OK
!
他のケース
他にもこんなところで
配慮されていたり
他にもこんなところで
配慮されていたり
1.予期しないインスタンスの解放を防ぐ
他のスレッドで実?行行されるまでの間に
インスタンスが解放されないようにする
他のスレッドで実?行行されるまでの間に
インスタンスが解放されないようにする
1. 引数 withObject に渡されたインスタン
スが渡された時点で retain ?される
2. 別スレッドでの実?行行が終わると、インス
タンスは release ?される
1. 引数 withObject に渡されたインスタン
スが渡された時点で retain ?される
2. 別スレッドでの実?行行が終わると、インス
タンスは release ?される
performSelector:onThread:withObject
:... ?によるインスタンスの?生存保証
performSelector:onThread:withObject
:... ?によるインスタンスの?生存保証
2.予期しない値の変化を防ぐ
渡された NSString ?を
複製してインスタンス変数に持つ?方法
渡された NSString ?を
複製してインスタンス変数に持つ?方法
複製を内部に持つ事で
外部での値変更更の影響を受けない
複製を内部に持つ事で
外部での値変更更の影響を受けない
1. NSString ?のインスタンスは編集可能な
場合がある (NSMutableString)
2. そこで copy ?して、渡されたものとは
別の NSString ?を持つようにする
1. NSString ?のインスタンスは編集可能な
場合がある (NSMutableString)
2. そこで copy ?して、渡されたものとは
別の NSString ?を持つようにする
スレッドセーフ
このような配慮で
複数スレッドに対応させている
このような配慮で
複数スレッドに対応させている
あとは宣伝 ...あとは宣伝 ...
本日リリースしました。本日リリースしました。
?音で再配達ゴッド?音で再配達ゴッド
? 不不在票の再配達?手配を
お?手伝いするアプリです。
? 有料料版は iPhone ?の携帯回線だ
けでも?手配ができます。
? 無料料版はトーンにした操作?音を
固定電話に聞かせて?手配します。
? 不不在票の再配達?手配を
お?手伝いするアプリです。
? 有料料版は iPhone ?の携帯回線だ
けでも?手配ができます。
? 無料料版はトーンにした操作?音を
固定電話に聞かせて?手配します。

More Related Content

Objective-C atomicity #idevjp