SlideShare ist ein Scribd-Unternehmen logo
1 von 62
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  の携帯回線だ
けでも⼿手配ができます。
• 無料料版はトーンにした操作⾳音を
固定電話に聞かせて⼿手配します。

Weitere ähnliche Inhalte

Was ist angesagt?

超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programming
超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programming超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programming
超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programming
mametter
 
Perl 非同期プログラミング
Perl 非同期プログラミングPerl 非同期プログラミング
Perl 非同期プログラミング
lestrrat
 
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
Observable Everywhere  - Rxの原則とUniRxにみるデータソースの見つけ方Observable Everywhere  - Rxの原則とUniRxにみるデータソースの見つけ方
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
Yoshifumi Kawai
 
Sns suite presentation
Sns suite presentationSns suite presentation
Sns suite presentation
Jason Namkung
 

Was ist angesagt? (20)

Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
 
怠惰なRubyistへの道 fukuoka rubykaigi01
怠惰なRubyistへの道 fukuoka rubykaigi01怠惰なRubyistへの道 fukuoka rubykaigi01
怠惰なRubyistへの道 fukuoka rubykaigi01
 
Kanazawa.js.Next
Kanazawa.js.NextKanazawa.js.Next
Kanazawa.js.Next
 
Effective modern-c++#9
Effective modern-c++#9Effective modern-c++#9
Effective modern-c++#9
 
final int をFINAL しやがれ!
final int をFINAL しやがれ!final int をFINAL しやがれ!
final int をFINAL しやがれ!
 
emc++ chapter32
emc++ chapter32emc++ chapter32
emc++ chapter32
 
超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programming
超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programming超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programming
超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programming
 
Perl 非同期プログラミング
Perl 非同期プログラミングPerl 非同期プログラミング
Perl 非同期プログラミング
 
Em synchrony について
Em synchrony についてEm synchrony について
Em synchrony について
 
effective modern c++ chapeter36
effective modern c++ chapeter36effective modern c++ chapeter36
effective modern c++ chapeter36
 
Quine・難解プログラミングについて
Quine・難解プログラミングについてQuine・難解プログラミングについて
Quine・難解プログラミングについて
 
イマドキC++erのモテカワリソース管理術
イマドキC++erのモテカワリソース管理術イマドキC++erのモテカワリソース管理術
イマドキC++erのモテカワリソース管理術
 
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
Observable Everywhere  - Rxの原則とUniRxにみるデータソースの見つけ方Observable Everywhere  - Rxの原則とUniRxにみるデータソースの見つけ方
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
 
Don't Reinvent The Wheel ~ For All Android Beginners ~
Don't Reinvent The Wheel ~ For All Android Beginners ~Don't Reinvent The Wheel ~ For All Android Beginners ~
Don't Reinvent The Wheel ~ For All Android Beginners ~
 
undefined in getElement(s)
undefined in getElement(s)undefined in getElement(s)
undefined in getElement(s)
 
Sns suite presentation
Sns suite presentationSns suite presentation
Sns suite presentation
 
Groovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUGGroovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUG
 
Reading Anorm 2.0
Reading Anorm 2.0Reading Anorm 2.0
Reading Anorm 2.0
 
Java開発の強力な相棒として今すぐ使えるGroovy
Java開発の強力な相棒として今すぐ使えるGroovyJava開発の強力な相棒として今すぐ使えるGroovy
Java開発の強力な相棒として今すぐ使えるGroovy
 
Swift 2.0 大域関数の行方から #swift2symposium
Swift 2.0 大域関数の行方から #swift2symposiumSwift 2.0 大域関数の行方から #swift2symposium
Swift 2.0 大域関数の行方から #swift2symposium
 

Ähnlich wie Objective-C atomicity #idevjp

197x 20090704 Scalaで並行プログラミング
197x 20090704 Scalaで並行プログラミング197x 20090704 Scalaで並行プログラミング
197x 20090704 Scalaで並行プログラミング
Net Penguin
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
yoshiaki iwanaga
 
Node.js - sleep sort algorithm
Node.js - sleep sort algorithmNode.js - sleep sort algorithm
Node.js - sleep sort algorithm
takesako
 

Ähnlich wie Objective-C atomicity #idevjp (10)

Swift の可変値と不変値 〜 前回の続き(おまけ)〜 #cocoa_kansai
Swift の可変値と不変値 〜 前回の続き(おまけ)〜 #cocoa_kansaiSwift の可変値と不変値 〜 前回の続き(おまけ)〜 #cocoa_kansai
Swift の可変値と不変値 〜 前回の続き(おまけ)〜 #cocoa_kansai
 
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiJavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
 
Swiftのアプリ開発でハマったこと
Swiftのアプリ開発でハマったことSwiftのアプリ開発でハマったこと
Swiftのアプリ開発でハマったこと
 
197x 20090704 Scalaで並行プログラミング
197x 20090704 Scalaで並行プログラミング197x 20090704 Scalaで並行プログラミング
197x 20090704 Scalaで並行プログラミング
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
色々なダイクストラ高速化
色々なダイクストラ高速化色々なダイクストラ高速化
色々なダイクストラ高速化
 
Node.js - sleep sort algorithm
Node.js - sleep sort algorithmNode.js - sleep sort algorithm
Node.js - sleep sort algorithm
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2
 
Var handles jjug_ccc_spring_2018
Var handles jjug_ccc_spring_2018Var handles jjug_ccc_spring_2018
Var handles jjug_ccc_spring_2018
 
Swift 構造体の時代 #yidev
Swift 構造体の時代 #yidevSwift 構造体の時代 #yidev
Swift 構造体の時代 #yidev
 

Mehr von Tomohiro Kumagai

Mehr von Tomohiro Kumagai (20)

最近気づいた勉強法 — 勉強会開催の習慣化 #yumemi_grow
最近気づいた勉強法 — 勉強会開催の習慣化 #yumemi_grow最近気づいた勉強法 — 勉強会開催の習慣化 #yumemi_grow
最近気づいた勉強法 — 勉強会開催の習慣化 #yumemi_grow
 
Swift 所有権 要諦 #ゆるちとせ
Swift 所有権 要諦 #ゆるちとせSwift 所有権 要諦 #ゆるちとせ
Swift 所有権 要諦 #ゆるちとせ
 
_Function Builders in Swift #love_swift
_Function Builders in Swift #love_swift_Function Builders in Swift #love_swift
_Function Builders in Swift #love_swift
 
Property Wrappers の特徴を眺める #swiftzoomin
Property Wrappers の特徴を眺める #swiftzoominProperty Wrappers の特徴を眺める #swiftzoomin
Property Wrappers の特徴を眺める #swiftzoomin
 
みんなで Swift 復習会 GO! in "Swift Days Fukuoka" – 12nd′ オープニング&資料
みんなで Swift 復習会 GO! in "Swift Days Fukuoka" – 12nd′ オープニング&資料みんなで Swift 復習会 GO! in "Swift Days Fukuoka" – 12nd′ オープニング&資料
みんなで Swift 復習会 GO! in "Swift Days Fukuoka" – 12nd′ オープニング&資料
 
みんなで Swift 復習会
GO! in 札幌 – 10th′′
みんなで Swift 復習会
GO! in 札幌 – 10th′′みんなで Swift 復習会
GO! in 札幌 – 10th′′
みんなで Swift 復習会
GO! in 札幌 – 10th′′
 
イニシャライザー Part 2.5 #hakataswift
イニシャライザー Part 2.5 #hakataswiftイニシャライザー Part 2.5 #hakataswift
イニシャライザー Part 2.5 #hakataswift
 
ニコニコ超会議・文化の交差点 #techpub #ニコニコ超会議 #さくらシンデレラ
ニコニコ超会議・文化の交差点 #techpub #ニコニコ超会議 #さくらシンデレラニコニコ超会議・文化の交差点 #techpub #ニコニコ超会議 #さくらシンデレラ
ニコニコ超会議・文化の交差点 #techpub #ニコニコ超会議 #さくらシンデレラ
 
Swift クラスのイニシャライザー #devsap
Swift クラスのイニシャライザー #devsapSwift クラスのイニシャライザー #devsap
Swift クラスのイニシャライザー #devsap
 
iOSCon 2019 in London #ioscon #love_swift
iOSCon 2019 in London #ioscon #love_swiftiOSCon 2019 in London #ioscon #love_swift
iOSCon 2019 in London #ioscon #love_swift
 
Around the 変数 let #love_swift
Around the 変数 let #love_swiftAround the 変数 let #love_swift
Around the 変数 let #love_swift
 
もくもく執筆会 #技術同人誌再販Night
もくもく執筆会 #技術同人誌再販Nightもくもく執筆会 #技術同人誌再販Night
もくもく執筆会 #技術同人誌再販Night
 
みんなで Swift 復習会 GO! in 岩手 – 9th′
みんなで Swift 復習会 GO! in 岩手 – 9th′みんなで Swift 復習会 GO! in 岩手 – 9th′
みんなで Swift 復習会 GO! in 岩手 – 9th′
 
macOS アプリで Swift Package Manager を使ってみる #love_swift #hakataswift
macOS アプリで Swift Package Manager を使ってみる #love_swift #hakataswiftmacOS アプリで Swift Package Manager を使ってみる #love_swift #hakataswift
macOS アプリで Swift Package Manager を使ってみる #love_swift #hakataswift
 
みんなで Swift 復習会 GO! in 福岡 – 8th′ #minna_de_swift
みんなで Swift 復習会 GO! in 福岡 – 8th′ #minna_de_swiftみんなで Swift 復習会 GO! in 福岡 – 8th′ #minna_de_swift
みんなで Swift 復習会 GO! in 福岡 – 8th′ #minna_de_swift
 
Getting Started with Attending iOSCon in London 高画質・追記版 #love_swift #ioscon
Getting Started with Attending iOSCon in London 高画質・追記版 #love_swift #iosconGetting Started with Attending iOSCon in London 高画質・追記版 #love_swift #ioscon
Getting Started with Attending iOSCon in London 高画質・追記版 #love_swift #ioscon
 
みんなで Swift 復習会
GO! in 京都 – 6th′
みんなで Swift 復習会
GO! in 京都 – 6th′みんなで Swift 復習会
GO! in 京都 – 6th′
みんなで Swift 復習会
GO! in 京都 – 6th′
 
みんなで Swift 復習会 GO! in 福岡 – 5th′
みんなで Swift 復習会 GO! in 福岡 – 5th′みんなで Swift 復習会 GO! in 福岡 – 5th′
みんなで Swift 復習会 GO! in 福岡 – 5th′
 
勉強会の東京外開催の気持ち #yuru_bounen2017
勉強会の東京外開催の気持ち #yuru_bounen2017勉強会の東京外開催の気持ち #yuru_bounen2017
勉強会の東京外開催の気持ち #yuru_bounen2017
 
みんなで Swift 復習会 GO! in 福岡・発表資料
みんなで Swift 復習会 GO! in 福岡・発表資料みんなで Swift 復習会 GO! in 福岡・発表資料
みんなで Swift 復習会 GO! in 福岡・発表資料
 

Kürzlich hochgeladen

Kürzlich hochgeladen (12)

LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 

Objective-C atomicity #idevjp