PIYO - Tech & Life -

NSCopyingって何?

先日書いた「ペア要素をキーにしたNSDictionary」という記事でNSDictionaryのキーにしたPairクラスはNSCopyingプロトコルを実装するように書きました。

このNSCopyingに関してはこれまで詳しいことを知らなかったのでヘッダーやリファレンスで調べてみました。

  1. あるクラスをコピー可能にする場合はNSCopyingプロトコルを継承しておく必要がある
  2. NSCopyingプロトコルを継承するクラスはcopyWithZone:を実装する必要がある

ということらしいです。

NSCopyingプロトコルの継承

Objective-Cクラスのインスタンスをコピーするためにcopyというメソッドが用意されています。このcopyメソッドは実際はcopyWithZone:を呼び出して結果をそのまま返す実装になっているようです。

iOS Developer Libraryにはこのような記述があります。

copy

Returns the object returned by copyWithZone:.

なお、copyWithZone:を定義していない(つまりNSCopyingを継承していない)クラスに対してcopyメソッドを呼ぶと例外が投げられます。

つまり、自前クラスをコピーできるようにしたい場合はNSCopyingを継承してcopyWithZone:を書いておく必要があります。

copyWithZone:の実装

これはそもそもObjective-Cのプロトコルとはそういうものなので詳しく説明するまでもないか、、、

NSCopyingはメソッドを1つだけ持ち、それがcopyWithZone:です。NSCopyingを継承した場合はcopyWithZone:メソッドを定義し、適切なコピーを行う実装を書く必要があります。ちゃんとプロパティごとにコピーした要素を返すとかね。

先日の記事の例で言えば、NSDictionaryのキーになる要素は必ずcopyされるので、NSCopyingプロトコルを継承し、適切なcopyWithZone:の実装が必要だったというわけでした。

RELATED

ペア要素をキーにしたNSDictionary

NSDictionaryで複数要素をキーにしようというお話です。 普通の連想配列はキーとバリューで1つの組み合わせになりますが、片方が◯でもう片方が☆のときはこの値みたいなケースの場合は最初から用意されているデータ型では間に合わないことが多いです。

AVFoundationを使ったカメラ機能はちゃんとメモリを開放しましょう

こちらを参考にAVFoundationを使ったカメラを実装したのですが、このやり方だとどうもメモリを圧迫するということがわかりました。 iOSのカメラ機能を使う方法まとめ【13日目】 | Developers.IO カメラ機能を使うビューに移動→戻る、を繰り返すとだんだんと移動が重くなっていきます。1分以上反応しなかったりとか。Xcodeでモニタリングしているメモリ使用量も増え続けます。

XcodeインスペクタのState Config

UIButtonってタップ中の状態に色とか背景とか画像とか変えられますよね。てっきりコードでしか出来ないと思っていたらそんなことありませんでした。恥ずかしい。 このState Configを変えてから設定を変えると、そのStateに対して値が用いられるみたいですね。例えばタップ中の文字列を変えたいならState ConfigをHighlightedにしてからタイトルを編集すればいいってことです。