タグ

ブックマーク / akisute.com (18)

  • 既存の Objective-C のメソッド引数の Swift 上での扱われ方を調べてみた

    前置き こちらの記事には2014/06/09現在、公式にはリリースされていないiOS8プレリリースドキュメントへのリンクが含まれます。iOS8にて新しく追加された内容には一切触れておらずAppleとのNDA規約にも違反するものではないという認識ですが、場合により予告なく削除する可能性があります。予めご了承ください。 題 iOS8プレリリースドキュメントを眺めていて気になったのですが、ほとんどのCocoaのメソッドの引数に!がついています。例えばNSKeyValueObservingプロトコルのaddObserver:forKeyPath:options:context:メソッドのシグネチャは以下のようになっています。 func addObserver(_ anObserver: NSObject!, forKeyPath keyPath: String!, options options

    既存の Objective-C のメソッド引数の Swift 上での扱われ方を調べてみた
  • Jenkins を iOS アプリ開発に導入してみた (gcov編)

    前回 はSenTestKitに続いてGHUnitを導入して、Jenkins上でGHUnitによるテストの自動実行を行いました。今回はさらにステップアップして、gcovを使用してコードカバレッジを取るようにしてみようかと思います。 ■gcovを使ったコードカバレッジの取得(Xcode 4.3版) Xcode 4.3の場合は以下の参考ページで紹介されている方法がオススメです。実機ででもシミュレータでも動作してお得です。 http://www.cocoabuilder.com/archive/xcode/314794-xcode-4-3-moved-libprofile-rt-how-to-reference-it-now.html http://www.infinite-loop.dk/blog/2012/02/code-coverage-and-fopen-unix2003-problems

    Jenkins を iOS アプリ開発に導入してみた (gcov編)
  • Jenkins を iOS アプリ開発に導入してみた (GHUnit編)

    前回 はSenTestKitを用いてJenkins上で単体テストの自動実行を行いました。今回はGHUnitを使った単体テストの自動実行にチャレンジしてみたいと思います。またついでといっては何ですが、単体テスト時に必要になってくるモックを作成するためのライブラリOCMockも同時に導入してみようと思います。 ■なぜGHUnitを使うのか GHUnitを使うことで、SenTestingKitと比べて以下のようなメリットが得られます。 非同期処理のテストを行うための仕組みが用意されている(GHAsyncTestCase)これをSenTestingKitないし他のテスティングフレームワークでやろうとすると大変骨が折れます。 .app形式(要するに実際のiOSアプリケーション)でテストを実行するため、UIApplicationやUIWindowといったUIコンポーネントを使うクラスのテストが可能にな

    Jenkins を iOS アプリ開発に導入してみた (GHUnit編)
  • Jenkins を iOS アプリ開発に導入してみた (SenTestKit編)

    最近、iOSアプリの開発でも継続的インテグレーション(CI)を取り入れていくプロジェクトが増加傾向にあるようで、各種ツールやライブラリ、ノウハウが出回ってきているように感じられます。そこで私も早速iOSアプリ開発でのCI導入を試してみることにしました。今回の導入試験では、以下のような環境を想定して行いました。 iOSアプリの開発を、Xcode 4.X系のプロジェクトとして行う。 VCSにはgitを採用し、githubの公開リポジトリをリポジトリサーバーとして使用する。 CIサーバにはMacを採用し、プロジェクトをビルドするためにXcode 4.Xをインストールしておく。 ■必要なツールを準備する CIといったら、まずは何はなくともJenkinsです。 http://jenkins-ci.org/ ここでは導入について詳しくは挙げませんが、私は以下のを参考にしました。 https://gi

    Jenkins を iOS アプリ開発に導入してみた (SenTestKit編)
  • gdb で void* 型の変数をデバッグする

    C言語で実装されたライブラリやアプリケーションでは、汎用的な型として随所で void* が使用されますが、これをgdbからデバッグすると、そのままでは型情報が無いためタダのポインタとして扱われてしまいます。これではデバッグ時の都合がよろしくないです。 (gdb) print 0xfee65c0 $1 = 267281856 (gdb) print (void *)0xfee65c0 $2 = (void *) 0xfee65c0 こんなとき、この void* が指し示している先の型がわかりきっている場合は、その型でキャストしてやって: (gdb) print (struct imap_session_state_data *)0xfee65c0 $4 = (struct imap_session_state_data *) 0xfee65c0 (gdb) print $4 $5 = (st

  • iOS 5の日本語キーボードの高さに対応する (iOS 3, 4, 5全対応)

    iOS 5より日語キーボードの高さが変わっているので、今まで決め打ちで高さ216pxとかやってレイアウトしていたビューが軒並み使えなくなってしまいました。今後はキーボードが出たり引っ込んだり種類が切り替わったりのタイミングできちんとキーボードの大きさを調べて適切にビューをレイアウトしてやる必要があります。ということでその対応をしたのでメモ。 前提条件として、以下の要件を満たすように作りました。iOS 3, 4, 5全てで正常に動作すること。iOS 3.0でも動作しなければならない。 キーボードのframeを適切に取得できること キーボードが出てくるタイミング、消えるタイミング、キーボードの種類が変わるタイミング、全て取れること ■まずはログを見てみる キーボードの動作のタイミング、およびキーボードのframeは、NSNotificationを使って取得することができます。使用するNoti

  • iOS, Android, Windows Phoneのメモリ管理とかメッセージングの仕方を調べてみた

    ► 2021 (1) ► 12月 (1) ► 2020 (1) ► 12月 (1) ► 2019 (4) ► 12月 (1) ► 9月 (1) ► 6月 (2) ► 2018 (3) ► 12月 (3) ► 2017 (4) ► 12月 (1) ► 6月 (1) ► 5月 (1) ► 3月 (1) ► 2016 (12) ► 12月 (2) ► 11月 (3) ► 10月 (2) ► 9月 (2) ► 6月 (2) ► 1月 (1) ► 2015 (13) ► 12月 (3) ► 11月 (1) ► 10月 (2) ► 9月 (1) ► 7月 (1) ► 4月 (1) ► 3月 (1) ► 2月 (1) ► 1月 (2) ► 2014 (28) ► 12月 (4) ► 9月 (4) ► 8月 (3) ► 6月 (5) ► 5月 (1) ► 4月 (3) ► 3月 (2) ► 2月 (2)

  • [UIView willMoveToSuperview:] が便利です

    UIKitやFoundationには、iOS 2.0のころから存在するのに、意外と知られていない便利なメソッドやプロパティがたくさんあります。今回はUIViewのメソッドをご紹介します。 UIViewはUIViewControllerと違ってライフサイクルが単純で、どのタイミングで自分自身が画面上に追加されたのか、どのタイミングで自分自身が画面から外されたのか、などを把握しづらいとお嘆きの方がいらっしゃると思います。事実その用途のためだけにUIViewControllerを使ってプログラミングをしている人も見かけます。そこで以下のメソッドをご紹介です。willMoveToSuperview:自分自身が新しいSuperview以下に移動しようとしたとき(新しいSuperviewに対してaddSubview:されようとしたとき)に呼び出されます。didMoveToSuperview自分自身が新

  • UIWebView のスクロールを制御するためのプロパティを書いてみた

    UIWebView にどうして scrollEnabled プロパティがついてねえんだ Apple のチンパンジー野郎!とお嘆きの全国1000万の iOS 開発者の皆様、こんばんわ。もちろん私もその一人であります。 嘆いていてもしょうがないので何とかスクロールを制御する方法を・・・と思って探していたら、すでに2009年の地点で @nakamura001 さんがこんなブログを書いてらっしゃいました。 http://d.hatena.ne.jp/nakamura001/20090520/1242837408 が、遷移先で詳解されている http://praveenmatanam.wordpress.com/2009/04/03/how-to-disable-uiwebview-from-user-scrolling/ のコードが正直いまいちなのです。何がいまいちって、せっかくのCocoa環境で

  • BPStudy #46 での発表資料 ViewController の作り方を公開してます

    かなり旧聞になってしまいますが、 BPStudy #46 で話したときの資料をpreziにアップしてますので、ご覧いただけます。 http://prezi.com/7b_joy2lcfil/bpstudy-46/ 発表時にお見せしたソースコードはちょっと公開出来なかったのでこの資料だけだとイマイチよくわからないのですが、要するにView Controllerにサービスを書かないようにしてサービスレイヤを分離しろView Controllerの描画コードは、アウトレットの生成、アウトレットのデータ更新、アウトレットのレイアウトの3つに分離しろって言う感じのお話をしました。 すげー当たり前のことしか書いてなくて恐縮なのですが>< 実際、人様のコードをメンテしたりバージョンアップしたりするお仕事をいただいていると、ほとんど全てのコードがこの問題に引っかかっていて非同期通信化すると動かないとかちょ

  • iOS で正規表現を使う (3.0, 3.1, 3.2, 4.0)

    iPhone / iPad アプリで正規表現を使いたいときはどうするのか調べてみました。 ■iOS 4.0以上 NSRegularExpression があるのでそれを使えば万事解決です。 ■iOS 3.2 http://blog.livedoor.jp/pnfhy316/archives/277806.html こちらのブログでご紹介されているとおり、NSString rangeOfString:options: で NSRegularExpressionSearch を指定するのが楽です。 正規表現のグループ参照はできませんけれど、まぁしょうがないですかね。 ■iOS 3.1, 3.0 http://d.hatena.ne.jp/KishikawaKatsumi/20081031/1225463896 こちらのブログでご紹介されているとおり、ライブラリを使うのがよいようです。 または最

  • CALayer を使って UIImage を描画する

    UIImage を高速で描画する必要がある案件に遭遇したため、 CALayer を使ってみました。 CALayer と聞くとなにやら難しい感じがしますが、実際に使ってみると非常に簡単で高速です。 CALayer を使うと良い場面は以下のような場合です。 画像を大量に描画する必要がある 画像を高速に描画する必要がある 画像を高速に変形・移動する必要がある CGContextDrawImage を今使っている箇所がある とくに変形に対して非常に強いです。 CGContextDrawImage で変形後の UIImage を再度描画し直したりするのに比べると、 CALayer の変形は格段に高速に動作します。 ■実際に描画してみる まず最初に <QuartsCore/QuartsCore.h> をインポートします。 QuartzCore.framework をプロジェクトに追加するのも忘れないよ

  • Core Graphics (Quartz) のみで日本語文字列を描画するライブラリのヘッダファイルを書いてみた

    とある理由で UIKit の描画機能が使えず、 Core Graphics のみで文字列の描画処理を行わなければならないことになってしまったので、適当に調べてみました。 ■ことのはじめ Core Graphics の機能だけで日語の文字列を描画する方法については、既に先人の方々が調べて記事にまとめてくださっていたので、そちらを見ていただければ大丈夫です。 http://iphone-dev.g.hatena.ne.jp/ktakayama/20100129 http://d.hatena.ne.jp/r_kurain/20100316 基的にはこちらで紹介されている方法に従って進めていけば困ることはありません。ただし、描画した文字が上下反対になることがありますので、 CGContextSetTextMatrix を使う箇所を調整したりする必要があるかも。 で、最大の問題になるのがこれら

  • NSOperation を使って外部 API から非同期に結果を取得してみる

    iPhone / iPad のアプリを作っていると、頻繁に登場するのが「外部 API を HTTP 経由で実行して結果を XML / JSON で取得し、それを解析してモデルクラスに変換してデータ構造に突っ込む」パターンです。当然たくさんの先人の皆様がすでに効率的なライブラリを作成されているのですが、あえて私も車輪の再発明に挑戦してみました。今回使用したのは NSOperation クラスです。 NSURLConnection クラスとデリゲートを使うだけでも簡単に非同期通信を実現することができるのですが、さらに NSOperation クラスと NSOperationQueue を使うことでさらにタスク間の依存関係を簡単に設定できたり、タスクの並列度を簡単に制御したりできそうなので、挑戦してみました。 2010/12/29追加: 発展版をASIHTTPRequestを使って作成してみまし

  • iPhoneアプリをローカライズ(国際化対応)してみた

    まずはNSLocalizedString()を利用してアプリを作る次にgenstringsコマンドを利用してLocalizable.stringファイルを自動生成するXcodeに取り込むXcodeからローカライズの設定を行う最後にかっこよく翻訳を行うinfo.plistファイルの中身をローカライズしたい(たとえばアプリ名など)ときは、InfoPlist.stringsファイルを手で作って、ローカライズ設定をして、翻訳すると良いLocalizable.stringは基UTF-16に統一しておくことInfoPlist.stringsはUTF-16でないと動かない。Localizable.stringsはUTF-8でいいらしい(未確認) iPhoneアプリを作ったならば、 「一人でも多くの人に使ってもらいたい」 「1でも多く売りたい」 というのが心情というものです。 日ではヒットしないアプ

    iPhoneアプリをローカライズ(国際化対応)してみた
  • Xcodeのテンプレートを作成する方法

    Xcodeにデフォルトで付随しているテンプレートでは満足出来なくなってきたため、デフォルトのテンプレートを改造して自分用の新規ファイル作成テンプレートを作ることにしました。 参考文献はこちら。 http://d.hatena.ne.jp/griffin-stewie/20090315/p1 ■デフォルトのテンプレートのあるパス デフォルトのiPhone SDK用のテンプレートは以下のパスにあります。 /Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/ 中を見ると、 akisute Xcode$ pwd /Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode akisute Xcode$ tree -L 1 . |-- File Templates

    Xcodeのテンプレートを作成する方法
    griffin-stewie
    griffin-stewie 2009/07/18
    ファイルの方のテンプレートカスタム
  • Cocoa(iPhone)で、日本語を含むURLを開く方法

    的にはCore FoundationのC関数を利用する CFURLCreateStringByAddingPercentEscapes() ただし、一部問題のあるケースがある URL中に&を含む場合などは正しく作れないので別の方法が必要 プログラマをやっていると、だんだんと日語が嫌いになってきます。 いや、嫌いというのはおかしいのですが、とにかく英語以外の言語はトラブルが多いです。 コンピューターというのはつくづく英語を処理するためだけに作られているのだと思います。 (だからこそ、プログラムの「国際化」で飯をえる人がいる訳ですけど!) すみません、前置きが愚痴っぽくなってしまいました。 iPhoneプログラミングにおいてももちろん、日語を使う際に罠があります。 たとえばNSURLRequestなどがそうです。 日語の含まれるURLを開こうとすると、うまく解釈してくれないんです。

    Cocoa(iPhone)で、日本語を含むURLを開く方法
  • Objective-CではvalueForKeyPath:で集計関数みたいなものが使えて凄く便利

    Pythonだと、 list = [{'no':1, 'name':'akisute'}, {'no':2, 'name':'abesi'}, {'no':3, 'name':'hidebu'}] maxNo = max(list, key=lambda x:x['no']) こんな感じでリストに含まれるオブジェクトの最大値を簡単に取り出せたりするのですが、Objective-Cでもできないかと思い調べてみました。ですが、NSArray自体にはそのようなメソッドが用意されていません。ひょっとして出来ないのかと思っていたら、ちょっと面白い方法で集計関数のようなものが実装されていることがわかりました。 Objective-CにはKey-Value Codingという概念があって、それを使って実装されているようです。Key-Value Codingについては正直全然理解していないのでここでの解説

  • 1