GKSession で送信できるデータサイズの制限

GKSession の sendData*** で、1度に送信できるパケット?のサイズは1000byte以下が推奨されてて、最大でも87KBとなっている。
ちょっとした用事でiPad同士をBluetoothで通信させることになって、コード自体はすぐ書けた。
で、送信するデータなんだけども、UIImage(jpg)+ NSString 2つを持つクラスをNSKeyedArchiverでNSDataに固めたもの。

[data length]

でデータのサイズを調べると、約200KB。
87KB超えてるわー分割しないとダメかーめんどくせーなー、と思ってたんだけど、なぜか普通に送信できてしまった。
GKSessionが内部で勝手に分割して送信してるのかも、でもそれだと87KBという制限を見せる意味が無い。
通信系のプログラミングはほぼ初体験だから、よくわからん。
送信できるならそれはそれでいいんだけど、動作が不安定だったりバグになったりすると恐いなぁ。

 

参考

http://ylb.jp/iOSDev/Bluetooth/BlueToothOnGamekit.pdf

Objective-Cの通知(Notification)を解除するタイミング

通知を受け取る登録したら、removeObserverで解除するというのは当然なんだけど、そのタイミングをミスっててかなりハマった。
具体的には、通知を登録→ビューを削除→通知を解除→同じビューを作成、するとそのビューが通知を受け取っちゃってる。
その新しいビューも通知登録するから、メソッドが複数回同時に呼ばれた。
んでその中でNSURLクラス使ったんだけど、呼んでないはずのinitFileURLWithPath:メソッドがエラーだとデバッガに出てきた。
原因わかんねぇぇぇぇとなってたところで通知じゃね?と気づいた。

ARCを使っててビューの解放を任せてたのが失敗だった。
removeFromSuperViewメソッドを使った時点でdeallocが呼ばれるものだと思ってたから、そこで通知を解除してた。
でも実際は呼ばれてなかったので、viewWillDisappear:で解除するようにしたらうまくいった。

備忘録です。

iOSシミュレータでタスクを消すと、アプリがクラッシュする原因

Xcodeで開発してて、シミュレータや実機でテスト中、メモリリークなどの確認のためにタスクを消してみた。
(ホームボタン2回押して、アイコン長押しで。)
するとその時点でホーム画面が真っ黒になったり、アプリを起動したら黒くなったり、終了前の画面で止まってたりとおかしいことになった。
ARCにメモリ管理任せてるから、終了時のメモリ解放がうまく行ってないのか……?
と思って調べたら見つけた。

Mobile Dev. (iPhone + Objcetive C)

Xcodeの左上にあるStopボタンで、デバッグを止めればいいらしい。
あーよかった。

変数、メソッドの宣言とかのまとめ

入門書にはヘッダに宣言を書くように書いてある。
しかし、プライベートなメソッドの宣言ができないし、変数に「 @private」を付けても、このObjective-Cという言語はその変数にアクセスできるらしい。
オブジェクト指向なのにカプセル化できないという、とんでもない矛盾にぶつかったので、いろいろ調べてみた。(主に2ch)
一部自分のやり方で書いてあるとこもあるから、間違ってたりもっと良い書き方があれば教えてほすぃぃ。

続きを読む