ObjCがサクっと書けるコーディングTips

2013年4月21日日曜日 | Published in | 1 コメント

このエントリーをはてなブックマークに追加

最近よく使っている省略記法を紹介する。これらを使うとなんとなく気分がいい。

クラスメソッドの . (ドット)アクセス


実はクラスメソッドも .(ドット)表記が可能になった。
[SomeClass sharedInstance]
     ↓
SomeClass.sharedInstance
当然ながらさらにメソッドも重ねられる。

SomeClass.sharedInstance.localName
Xcodeではクラスメソッドの.表記は補完が効かないのが難点。ただしそれ以降のメソッドは補完してくれる。
例えば SomeClass.share... ここまでは補完しないが、SomeClass.sharedInstance.local.. ここまで来ると補完できる。


インスタンス作成 (1)new

お馴染みの alloc/init の代わりに new が使える。
SomeClass* obj = [[SomeClass] alloc] init];
     ↓
SomeClass* obj = [SomeClass new];
. を使えばさらに短くサクっと書ける
SomeClass* obj = SompeClass.new;
+new は NSObjectで定義されている(new = alloc+initとの説明がある)
This method is a combination of alloc and init.
NSObject Class Reference

昔からObj-Cにあったメソッドだが、ARCになってから autoreleaseが不要になったので使いやすくなった。

(参考)
objective c - What is difference between new and [[alloc]init] in iOS? - Stack Overflow


インスタンス作成 (2)self


クラスメソッド内でselfはクラス自身を指す。なのでインスタンスの作成に使える。
+ (instancetype)sharedInstance
{
 SomeClass* obj = [[self alloc] init];
  :
  :
}
さらに . と new を使えばこう書ける。
SomeClass* obj = self.new;

instancetype については下記を参照
Objective-Cにおけるinstancetype型について - Takebayashi.Asia


配列・ディクショナリ作成

githubでソースコードを読んでて知った。mutableな配列・ディクショナリもサクっと書ける。
NSDictionary* dict = @{}
NSMutableDictionary* dict = @{}.mutableCopy;
NSArray* array = @[]
NSMutableArray* array = @[].mutableCopy;


- - - -
多くはgithubで他の人のコードを読んでて知ったもの。コードを読むことはアルゴリズムを読み解くだけでなくコーディングのトレンドもわかるなー。

NSSecureCoding - セキュアなプロセス間通信への小さな布石

2013年4月20日土曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

NSSecureCoding という聞きなれないプロトコルが iOS6/OSX10.8から導入された。ここでいうCodingとはオブジェクトの永続化のプロコトル NSCodingのそれを指している。つまり NSSecureCoding はセキュアな NSCodingのこと。


NSSecureCodingの定義はクラスメソッドが1つあるだけ。
+ (BOOL)supportsSecureCoding;

使い方の前に何故この新しいプロコトルが導入されたかというと、現状のNSCodingだと不正なオブジェクトのロードを防げないから。
例えば -initWithCoder: の標準的な実装はこうなる。
id obj = [decoder decodeObjectForKey:@"myKey"];
if (![obj isKindOfClass:[MyClass class]]) {...fail...}
2行目でクラスチェックを行っているが実際には1行目でインスタンス化されていて既にその時点でクラスおよびインスタンスのイニシャライザは起動している。つまり現状では仮に不正なクラスが読み込み対象のファイルに紛れ込んでもその初動を防ぐことができない。

そこでNSCoderクラスに新しく -[NScoder decodeObjectOfClass:forKey:] が導入された。
NSCoder Class Reference

先程の2行の代わりに1行でチェックとデコードを同時に行う。
id obj = [decoder decodeObjectOfClass:[MyClass class]
            forKey:@"myKey"];
もし
(a)指定クラスがNSSecureCodingを実装している
(b)指定クラスとロードするクラスが一致する
のどちらかを満たさない場合は例外がスローされ、インスタンスの作成は行われない。これにより不正な振る舞いを防ぐことができる。なおこのチェックを有効にするには -[NScoder requiresSecureCoding]でYESを返すようにしておく必要がある(NOだとチェックは働かず実質 decodeObjectforKey:と変らない)。

この外部からのインスタンスロードのチェックに NSSecureCodingが使われる。このNSSecureCodingを実装するには次のどちらか2つの条件を満たす必要がある。
[a] initWithCoder: をオーバーライドしない
[b] initWithCoder: をオーバーライドする場合、decodeObjectOfClass:forKey: を使う
さらに + supportsSecureCodingをオーバーライドして、YESを返す必要がある。
この辺り、NScoderの条件と合わせると若干複雑な感じはする。

NSSecureCodingが導入されたのはXPC導入に伴うもので、iOSに関して言えばiOS6からXPCが導入された。このXPC導入に伴い、従来はアプリ内(1プロセス内)で完結していた動作がプロセス間での協調動作できるようになった。この為、従来の信頼できる自アプリ内の永続化データだけでなく、外部プロセスとの通信時に送られてくるデータの復元(decode)が必要になってきた。この時、攻撃者が何らかの方法で不正なクラス・インスタンスのデータを紛れ込ますことに成功した場合、従来の initWithCoder: ではチェックする手段が無い(※こういう攻撃方法を object substitution attacks と呼ぶらしい)。この対策としてNSSecureCodingを始めとする一連のAPIが導入された。

なお XPC Serviceを作ったり、直接アクセスできるのは今のところApple提供のライブラリだけ。一般開発者には公開されていない。このあたり次期iOS7でどうなるのかが非常に興味深い。


- - - -
今のところ一般開発者が使う理由があまり思いつかないが、XPCが公開された時には必須スタイルになるのかもしれない。



(参考)iOS6でのXPC利用


(参考)NSSecureCodingについて


(参考)XPCの概要




あけましておめでとうございます 2013

2013年1月1日火曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

2013年もよろしくお願いいたします。
毎年元旦には昨年の反省や今年の目標を書いているので今年も書き留めておきます。

----------------------------------------------------------------
昨年は、初の個人制作アプリの発売と事業の立ち上げなど個人的には大きなイベントがありました。時間を掛けて今までコツコツと進めてきた活動が実を結び、個人的に目標としていた1つのマイルストーンがようやく達成できました。

次のマイルストーンを目指し今年は下記のことを目標として立ててみました。

・情報局の日々更新
・このブログの更新(不定期)

そして
・Androidアプリ1本以上のリリース
・新作iOSアプリ2本以上のリリース

さらに
・iOSアプリと連携した OS X アプリのリリース
・Windows8アプリ1本(JSベースで)のリリース

とここまで書いて遠い目に..

まあ自分勝手に目標を挙げるのは自由なので書くだけ書いておきます。下になるほど指数関数的に実現性が低くなりますが。。

経験的には立てた目標を実現するのに2〜3倍ぐらいは期間はかかるかな(すると2〜3年?!)。もちろん中止するものもあります。ただ自分の開発スピードが非常に遅いことは自覚しているので、時間がかかってもマイルストーンに向けて一歩一歩近づけていければ良いかと。諦めなければいつか到達できると思います(たぶん)。

----------------------------------------------------------------
iOS以外に手を出すのは、収入源が Apple1社依存ではリスクが高いといまさらながら思ったからです。昨年のApple都合による支払い遅延(2ヶ月も!)でそのリスクを実感しました。Appleの場合、今後もルール変更により同様に収益に影響を受ける可能性は十分にあると思います。趣味で作っているうちは良かったのですが、アプリ制作を事業の柱として考えた時に収入を1社に依存することはリスクがあると痛感しました。今年は売上を増やすと同時に収入源を分散させることを事業の目標として行きたいと思っています。またプラットフォームを変える他、広告やアプリ内課金の取り組みもやってみたいと考えています。

また昨年後半はアプリ制作に専念したせいでブログの更新が滞り、その結果新しいことを勉強する機会が減ったと感じました。情報の消費スタイルは従来と変らなかったのですが、アウトプット=発信が無いことで情報の理解力・吸収力が低くくなったと実感しました。やはり知ったことは人に話したり、書いて発信していかないと身にはならないですね。
アプリリリース後はそのバージョンアップとメンテナンスが中心になったことも、新しい事を手がけない傾向に拍車を掛けたと思います。それを反省し昨年末からリハビリを兼ねて情報局を再開しました。このブログも不定期ながらも何らかの記事を挙げて行きたいと思っています。AndroidやWindows8を手がける理由も新しい刺激を求めてということもあります。

そんなこんなで色々あると思いますが
今年もまたよろしくおねがいいたします。

SimpleCap のソースコードをGitHubへ公開しました

2012年10月11日木曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

ライセンスは MITです



・SimpleCap-1.2 は現在公開中のバージョンです。
・SimpleCap-1.3 は開発中の未公開バージョンです(範囲ヒストリなどがあります)

技術的な情報は旧Cocoaの日々にたくさん書いてあるのでそちらを参照してみてください。
旧Cocoaの日々
SimpleCapの開発を始めたところから記載があります。あのころはブログを毎日書いていたので、これを読むとSimpleCapの一つ一つの実装風景を見ることができます(長いけど)。


SimpleCapとは...

「Mac用のスクリーンショットツール。画面上の好きなエリアを簡単にイメージ保存できます。メニューバー常駐型なのですぐに使える。」

紹介記事など




- - -
このアプリを開発していた数年の間に子供3人が生まれたので個人的には思い出深いソフトです。通院中の妻を待ちながら喫茶店でプログラミング、なんてこともありました。まあ双子の出産が開発を止めた最大の理由でもあるのですが。

いつかはソースを公開しようと考えていましたが忙しさにかまけて放置状態にしていました。先日ソースを見せて欲しいと依頼が来たので、これをいい機会だと思い Githubへ公開しました。はっきり言って数年前のMac/Cocoa用コードなので、今のモダンなiOS/Cocoaコードに比べるとかなり古臭いです。それでも何かの役に立てればと思い公開しておきます。好きに使ってください。引き継いでのバージョンアップ大歓迎です ^^。ちなみにアプリは自分自身が毎日使っているヘビーユーザです。

なお今となってはほとんど忘れてしまったのですが、ネット上のコードをコピペしている箇所があるかもしれません。もし気がつかれた方がいたらご指摘下さい。クレジット表記を追加します。


PR: 今は iOSアプリをメインで開発しています。良かったらどうぞ。
Lakesoft
Lakesoft
EverGear - Evernote投稿ツール
★★★★☆
42件の評価
App Store

※こちらはソース公開してませんのであしからず。





EverGear 1.4 がリリースされました

2012年6月27日水曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

EverGear - 万能投稿ツール App

カテゴリ: 仕事効率化

価格: ¥170


要望の多かった履歴の再編集機能搭載の他、アイコンを一新しました。


Evernoteを使っている方は是非お試し下さい。

サポートページ (facebook)
EverGear | Facebook



EverGear 1.2 がリリースされました

2012年6月6日水曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加



EverGear - Lakesoft

目玉の機能は、URLスキーム対応と起動時即編集になりますが、その他にも色々と改良が入っています。実装メモも付けたので参考なればと思います。


新機能および調整


・起動時即編集機能
・URLスキーム対応
・スワイプによるカーソル移動
・写真の最大枚数 30枚
・Evernoteに投稿した時の日時の変更
・下書き-ログ画面に「写真」ボタンを追加
・ひな形経由の下書きの保存ルール変更
・写真サイズ追加(320px)
・写真が1枚も無いときに写真タブを開くとカメラが起動することを止めた
・カメラの縦・横の切替時の操作感を調整
・タイトルのみで本文がない場合、投稿時に本文にタイトルを挿入


不具合修正


・下書きに一覧に表示されているサイズが実際よりも割増しで表示されている問題が解消しました
・デフォルトひな形利用時にノートブックが下書きに反映されない件が解消しました
・1件も下書きが無い状態で「下書き」タブをクリックするとクラッシュする件が解消しました


URLスキーム対応


単純起動に加え、初期の動作モードを指定することができます。

(1) 単純起動
jp.lakesoft.EverGear://

(2) ノート新規作成
jp.lakesoft.EverGear://draft/add

新規作成用パラメータ
mode:0=テキスト入力 | 1=撮影モード | 2=カメラロール | 3=メモ入力 ※省略時は 0 指定と同じ
text:テキストの初期値(要UTF-8によるURLエンコード)

例えば、下記で呼び出すと初期テキストが "Hello" で、撮影モードで起動します。
jp.lakesoft.EverGear://draft/add?mode=1&text=Hello

次バージョンではひな形(テンプレート)の指定も可能になる予定です。

実装メモ

EverGearのような複数のUIモードと複数のデータを扱うアプリの場合、テキスト入力モードやカメラ撮影モードで立ち上げようとすると状態の管理が必要になる(これは後述する「起動時即編集」も同じ)。例えば、テキスト編集中の状態で他アプリから URLスキームを呼び出されたらどうするか?あるいは撮影中の場合は。EverGearでは、一旦現在編集中のデータをすべて保存した後、開いていたテキスト編集画面(モーダル)を閉じ、ホーム画面へ一旦戻る。その後、URLスキームの指示に従った画面を開き直している。

またURLスキームから呼び出された場合ユーザはアニメーションは期待していないはずだから、画面の開閉メソッドにはすべてアニメーションON/OFFの引数を追加し、これで制御するようにしてある。


起動時即編集


「設定」で「起動時即編集」をオンにすると、アプリがアクティブになる毎に新規入力モードで立ち上がります。前回起動時に下書きを開いていた場合はそのノートの編集モードで立ち上がります。

実装メモ

EverGear はUIに階層/状態がある。例えばテキスト入力中だと、入力画面のViewControllerがモーダル表示され、かつキーボードが表示されている。他には削除確認のアクションシートが出ていたり、撮影用のビューが出ているなど。この為一旦開いていた画面やモーダルな表示を閉じて、その上で目的の画面を改めて開く必要がある。

そんなわけで見た目は大した機能ではないが、裏側の実装はここが面倒だった。またアプリがアクティブになったタイミングで以前の画面を閉じていたのではタイムラグが生じることがわかった。そこで発想を変えて非アクティブになるタイミングで開いていた画面やモーダル表示を閉じるようにした。さらにこの過程でのアニメーションは不要なので、既存のメソッドにすべてアニメーションON/OFFの引数を追加して制御するようにした。これによって前回の状態にかかわらず、アプリをアクティブにすると一瞬で編集モードとして立ち上がるようにすることができた。

なお起動時即編集がやっていることは URLスキームの処理と変らないので実はこの機能は URLスキームの処理を内部的に使っている。つまりアクティブ時のイベント処理無いで下書き新規作成用のURLスキームを作成して、その処理へ回している。




FaceBookで最新情報を提供しています。
EverGearサポートページ

Twitter
@evergear


アプリ EverGear をリリースしました

2012年5月18日金曜日 | Published in | 2 コメント

このエントリーをはてなブックマークに追加

Evernote投稿用アプリ「EverGear」をリリースしました。1つのノートに20枚の写真やメモを付けることができたり、ノートのひな形(テンプレート)を作るといった特徴を持つアプリです。
※有料です。


写真


1つのノートに20枚までの写真を登録することができます。写真にメモを残すこともできます。



ログ


メモだけを残すこともできて、それらをまとめて時系列に表示できます。メモと写真の集まりを「ログ」と呼んでいます。※メモの件数に制限はありません。



ひな形


あらかじめ文字やノートブック、タグを定義しておいてそれをノート作成時に利用することができます。登録しておいたひな形はノート作成時にメニューから選んで利用できます。



送信


バックグラウンド送信に対応しています。送信中のノートは送信タブで見ることができます。



履歴


送信したノートを後から見返すことができます(最近50件まで、それ以前は自動削除)。



ノート編集


テキストの編集やノートブック指定、タグ指定など基本的な機能が揃っています。



設定画面





Evernote


ログは Evernoteに送られるとメモと写真(サムネイル)が時系列に記録されます。その下に写真が並びます。
構成イメージ
+ーーーーーーーーーー+
|   テキスト   |
+ーーーーーーーーーー+
|   ログ1    |
|   ログ2    |
|    :     |
+ーーーーーーーーーー+
|   写真1    |
|   写真2    |
|    :     |
+ーーーーーーーーーー+

Mac版のEvernoteで見たイメージ


ログ(メモ+サムネイルの時系列表示)

写真

iPhone版のEvernoteで見たイメージ


ログ(メモ+サムネイルの時系列表示)

写真


サポートサイト


Facebookにあります。リリース情報などは今後そちらで公開していきます。



人気の投稿(過去 30日間)