CocoaPodsとフレームワークの導入

フレームワークの導入を助けてくれる、CocoaPodsのインストール方法は各種サイトに載っているんだけど、基本的な使い方ではまった。
使い方の概要は「Xcodeのプロジェクトに対し、フレームワーク導入用のテキストファイル"Podfile"を用意し、それをCocoaPodsが参照して、対象のプロジェクトにフレームワークをインストールする」。


手順
(1)ターミナルから"pod init"で、対象のプロジェクトフォルダに初期化されたPodfileを生成する。
(2)初期化されたファイルから、必要な行のコメントアウトをはずす。
 対象は、"platform :iOS, .. "と、"use_frameworks!"の2箇所。
(3)(2)に、必要なフレームワークの名前とバージョンの記載を追加する。
 "pod 'フレームワーク名'[, '~>バージョン'] ※[]内を省略すると最新バージョンが取得される
(4)ターミナルから"pod install"(初回のみ。変更時は"pod update")で、インストール。
(5)プロジェクトフォルダに生成された、プロジェクト名.xcworkspaceを使用する。


注意点として、フレームワークのバージョンも、XcodeiOS?)のバージョンとの対応があるっぽい。
何も考えずにCorePlotの最新版(2.2.0)を入れたらビルド失敗した。
メッセージはswiftの名前がどうとかいうのだったけど、似た質問があって、どうやらバージョンの違いによるものっぽい・・と踏んで、1つ前のバージョン(2.1.0)を入れ直したところ、うまく動いた。


これで四苦八苦しているうちに、グラフ描画のフレームワークを導入するのに丸1日かかってしまった・・。

Xcodeのバージョン

アプリバージョンによって、対応するOSのバージョンが異なる。
Xcode7.3.1以降は、OS X 10.11 El Capitanにしか対応していないらしい。
うちのOSはOS X 10.10 Yosemiteなので、対応していない。
(Xcode7.3.1のインストーラをダウンロードしてきてインストールしようとしたところ、アイコンに駐車禁止マークがついていた。Xcode8はインストール時にエラーメッセージが出た。)


なので、Xcode 7.2.1をインストールした。

Macでアプリがインストールできないときの対処法

XcodeをAppStoreからアップデートしようとしたところ、まったく進まず困った。
調べてみると同じ現象が起こっている人はたくさんいるらしい。
今回やったのは、AppStoreからではなく、Webでインストーラをダウンロードしてきてそこからインストールするという方法。
Xcodeだけでなく、うまくいかなくなったときに使えるようなのでメモ。


AppleのDeveloperサイト
https://developer.apple.com
の中で、対象のアプリのダウンロードページにアクセスし、
対象のアプリのリンクを無視して、ページの一番下の
「See more downloads」をクリック。
対象アプリを「+」で開いて、でてきたインストーラファイルを選択してダウンロード。

シングルトンとマルチスレッド

1つのインスタンスを複数クラスから参照したい。
グローバルなインスタンスを作るしかないのかな・・と、調べてみると、
それを実現する「シングルトン」なる概念があることを知った。


1つのクラスに対して、インスタンスを1つだけ生成し、それを共有するというもの。
やりかたは他の方が解説してくれているので割愛。


で、その中で、「他のスレッドで同じ処理がされると・・」みたいな記述があって
「スレッド」って何?
と思い調べてみると、「タスク」的な意味であることがわかった。
つまり並列処理の用語。
iOSでは「マルチタスク」ではなく「マルチスレッド」で、Appleの開発した並列処理技術は「GCD」というらしい。
"@symchronized"は、タスク干渉防止みたいなものと考える。

アセットカタログと画像リソース

画像は「Images.xcassets」に入れる、という記事があった。


ただのimagesフォルダじゃダメなの?
1xとか2xってなに??


なんて初歩的な疑問を抱いた。
これも参入が遅すぎたために解決に時間がかかった・・。


iOS端末の多様化で、解像度もデバイスごとに違いがある。
「非RetinaRetina(高解像度)→Retina HDなんとか(もっと高解像度)」
こんな感じで、iOS端末のグレードアップに伴い解像度もあがっている。


で・・疑問の答えとしては、
「imagesフォルダでもいいし、1xや2xを作らなくても、まあ、動く。」
になると思う。


でも、問題点は、
「小さいデバイスでも、大きいデバイス用の大きい画像を用意しておく」
というリソースの無駄づかいや、
「デバイスにあわせた画像のリサイズをコード上でやることで、重くなる」
ということ。


だからそれぞれのデバイス用にサイズ調整した画像をあらかじめ用意しておく。
xcassetsというのは、アセットカタログというものらしい。
ちょっと前に追加された、画像を管理するためのツールだそう。
これを使うと、デバイスごとの画像の管理が楽になるらしい。
1xや2xはデバイスに対応していて、1xは一番小さい非Retina用、2xは縦横が2倍のRetina用、3xはそのさらに上の・・となっている。
それぞれに画像をセットすると、ワークスペースに画像がコピーされて、プロジェクト内ではそれを指定した名前で参照できる。

ストーリーボード

画面設計について。
買ってきた「超入門」の本には、
「ストーリーボードを使って、接続して・・」
って書いてあるんだけど、わからないときにググったりしてると、どうもストーリーボードっていうのは、いろいろやろうとすると難しそう。
というか、管理するのが大変そう。
こいつらをスクロールビューに入れて・・とか画策すると、いったん全部接続とか解除して、オートレイアウトも解除されてしまって・・とかなる。大変。
対象のインスタンスをコード上で取得するのにはあらかじめコードにインスタンスを登録して接続しておかないといけなくて、増えてくるとどんだけ追加するの?!ってなりそう。


基本的なパーツ構成だけストーリーボードに置いといて、スクロールビューやらテキストフィールドやらはコードで動的に配置したほうが都合が良いかな。
で、タグ(Integer)をつけておいて、取得するときはタグで。
タグはヘッダに列挙体を定義しておくと良いと誰かが言ってた。


列挙体は↓で定義できる。
typedef NS_ENUM(NSInteger, 列挙体の名前) {
 :
}


インスタンスの配置はUIViewを例にすると↓。
UIView *インスタンス名 = [[UIView alloc] init];
インスタンス名.frame = CGRectMake(x, y, width, height);
[配置先のビュー addSubview:インスタンス名];

メモがわりに

今更ながら、iOSアプリ開発を始めた。
なんとかなるでしょって始めたけど、Objective-Cという言語に慣れず、Xcodeという開発環境自体にもなかなか慣れられず、悪戦苦闘中。。
「あ、動いた」ってことはあっても、リリースを視野に入れる以上はきちんと理解しておきたい。
知識として得たことをメモっておきたい。
と思った時に、このブログの存在を思い出した。


すでに5年ほどほったらかしの若かりし頃の日記。
いろいろ恥ずかしいが、有効活用しようということで、ここにアプリ開発のメモを書いていこうと思う。
ただしいつまで続くかは神のみぞ知る。