他人のブログを読んだり、勉強会等のLTを聴いて感じること

こんにちは。

他人のブログを読んでいたり、勉強会や某ABCに参加してLTとか聴いていて感じたことを書きます。

1. お前のブログはオリジナリティがあるのか?
既知の内容なのに、そういった内容をブログに書いている人をよく見かけます。参考サイトのリンクを張っていればまだ許せますが、そういったものがないブログもあります。また、本に載っていることを書いているブログも見かけます。例えば、最近見かけたのでは、iOSでのUITableViewの使い方とか。これはひどいと思いました。お前が考案したAPIなのか?w

2. お前のブログは、どこかのサイトのページの翻訳ではないか?
Androidに関して、キーワードで日本語サイトをググると、Googleのドキュメントリファレンスのページをほぼ翻訳したページを見かけることがあります。ブログを書いている本人は、日本人のために翻訳してあげているんだとか言いそうですが、ブログ中に出てくるサンプルコードも、元のドキュメントリファレンスのページと同じことが多々あります。真っ先に日本語に訳して、日本で最先端を行っているとでも思っているのでしょうか。技術的にとんがりたいなら、自分で作ったサンプルアプリのコードでも載せて欲しいですね。また、最近見かけたブログでは、英語圏のブログのほぼ翻訳で、コード断片もコピペで、元のコードの、作者独自定義の定数を、定義もせずに(定義を引用もせずに)使用している例がありました。元の英語圏のブログでは、githubにサンプルコードがあったので、定数の定義を見ることができましたが、翻訳サイトでは、githubへのリンクは張られていませんでした。

3. 勉強会や某ABCのLTで笑いを取ることしかしない
勉強会や某ABCに参加してLTを聞いていると、次のようなことがあります。

a. アニメの画像をスライドに入れる。
面白くないですし、あなたは、そのアニメの作者に、画像の使用許諾を取ったのですか?

b. 奇声を上げて笑いをとろうとする
勉強会では見かけないですが、某ABCのLTではよく見かけます。ちっとも面白くないです。ビジネス、技術アピールで注目を浴びるようにして下さい。

c. その他
某ABCのLTで、当時流行っていた某ゲームアプリを、某テストツールで動かすことをやったLTがありました。はっきり言って、技術的に面白くないです。自分のプロダクトをテストツールで動かすのならいいですが、そうでないなら、単に笑いを取るだけの内容ですね。

iPhone 2Dゲームプログラミングを読んだ

STUDIO SHIN著の「本気でゲーム開発力をつけたい人のための! iPhone 2Dゲームプログラミング」を読んだので、書評を書きます。

 この本では、はじめに書いてある通り、iOSアプリの開発経験がない場合は、iOSアプリ開発の入門書を読むように書いてあるが、その通りであろう。また、SPriteKitのAPIについては、あまり説明なく使われているので、この本を読む前に、

SpriteKitではじめる 2Dゲームプログラミング Swift対応

などを読んだ方がいいだろう。Swiftについては、第2.2章で簡単な説明があるが、これについても、Swiftについての入門書を読んだ方がいいだろう。
 この本には次のような特徴がある。

1. 他のiOSアプリ開発本のSpriteKitの章や、SpriteKitアプリ開発本とは違い、1冊の本で、画面遷移のある本格的な1つのアプリの作り方を順を追って説明している。
2. 広告の貼り方やアプリ内課金のやり方にも説明をさいている。
3. アプリ内では、マップ、ステージを導入して、ゲームの進行に従って、遊ぶゲーム面を変える仕組みがあったり、弓という武器を購入することにより攻撃力を増したり、敵キャラ、ボスキャラ、障害物、アイテムの配置を自由に行う配置ツールの作り方も説明されているので、App Storeに出せるようなゲームアプリの開発をするのに役立つであろう。
4. アクションゲームというと、小さい画面のスマホでプレイヤーの操作をどうやるかが課題である。この本では、プレイヤーが矢を発射しないときは、マップを左に自動で移動させ(プレイヤーは通常画面内で固定位置で、マップが画面を左に流れていく)、武器である弓は、コントローラとして画面の一部に操作しやすい大きさに独立させ、弓を指で引くことにより、矢を発射するように工夫している。

 この本は、本のタイトルの通り、本格的なゲーム開発力をつけることができるが、次のようなマイナスな点がある。
1. 本に書かれているコードと、ダウンロードしたサンプルのコードとに食い違いが多い。一方では関数に引数があったのに、他方では引数がないとか。また、ボスキャラを導入したのに、本では、ItemPutViewControllerクラスの更新を説明していないとか、ItemBuyViewControllerクラスで、UITableViewDataSourceの記述がないとか。誤記が多い、本のコードとダウンロードしたコードに食い違いが多い点は、同じ著者の

SpritekIt iPhone 2Dゲームプログラミング

について、Amazonでのレビューで指摘されていたので、レビュー(点検)があまり行われなかったのであろう。
2. 本のコードでは、どこを書き換えていけばいいか分かりにくいところが多い。
3. 関数の中身が長すぎる。ifのネストが深すぎる。ifのブロックが長すぎる。Xcodeでコーディングしているとき、どのifのブロックにコードを書き加えたらいいかわかりにくく、バグが発生しやすい。こういうことを書くと、アプリ開発本は、順を追ってアプリの作り方を説明しているので仕方ない、リファクタリングを行うと、本のページ数が極端に多くなるという反論があるであろうが、例えば、ifのブロックの中身をはじめから関数として記述するなどの方法はあるであろう。
4. 配置ツールなしで、敵キャラ、障害物の位置がコードにじかに書かれていると、敵キャラが障害物に近接しすぎていて、ゲーム開始でゲームが即終了する。著者は、途中途中の開発過程のゲームの動作確認をやっているのだろうか。
5. サンプルコードが完成したものしかなく、章ごとのソースコードがなく、写経ミスがあった場合、原因を探りにくい。
6. 必要なコードが、本で説明されていないか、本を先まで読まないと書かれていないことが多い。例えば、4.2章で、矢を発射する操作は、gameStateが、.gamePlayingでないと、touchesBegan関数にある最初のif文内のreturnが実行され、touchBegan内の残りの処理が実行されない。gameStateのセッターで、shootOKをtrueに、gameStateを.gamePlayingにするなどの処理を書かないといけない。この説明がないので、4.2章で矢を発射できることを確かめることができない。
 以上の通り、マイナスな点が多いのではあるが、本格的なゲームアプリを開発するには、いい本であると思うので、評価4を付ける。

iOS 8 + Swiftで、performSelector:withObject:がない!!

國居貴浩氏のiPhoneアプリ開発のコツとツボ35のサンプルを、Swiftで書き換えることを試みています。

「Q05 UIViewにボタンの機能を追加するには?」 の「3 ターゲット/アクションデザインパターの実装」のサンプルを書き換えようとしました。ところが、Swiftでは、performSelector:withObject:メソッドがないんですね。メモリーリークを起こすことがあるとかで廃止になったようです。ググると、How to implement callback/selector with performSelector in swift?が引っかかりました。dispatch_afterを使って遅延実行を行うといいようです。参考にして実装してみました。

Button.swift

import UIKit

class Button: UIView {

var target:NSObject?
var action: Selector?

func myMethod(firstParam: String, setCallbackObject obj: AnyObject, withMySelector selector: Selector) {
if obj.respondsToSelector(selector) {
var myTimer: NSTimer = NSTimer.scheduledTimerWithTimeInterval(0.0, target: obj, selector: selector, userInfo: nil, repeats: false)
myTimer.fire()
} else {
println("Warning: does not respond to given selector")
}
}

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func drawRect(rect: CGRect) {
// Drawing code
}
*/

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
self.myMethod("thisfirstis", setCallbackObject: target!, withMySelector: action!);
}

そして、AppDelegate.swift


func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
// Override point for customization after application launch.
self.window?.backgroundColor = UIColor.whiteColor()

let button = Button(frame: CGRectMake(100, 100, 100, 100));
button.backgroundColor = UIColor.blueColor();
self.window?.addSubview(button);

button.target = self
button.action = "touched";

self.window?.makeKeyAndVisible()
return true
}

func touched() {
self.window?.backgroundColor = UIColor.blackColor()
}

これでうまくいきました。しかし、次の「4 ターゲット/アクションデザインパターンで色パレットを作る」の実装をやろうとすると、上の方法ではうまくいきません。push:メソッドは、Buttonインスタンスを引数に取るからです。いろいろ調べたら、Alternative to performSelector in Swift?にヒントがあり、アクションメソッドが引数を持つ場合は、dispatch_afterとNSThreadのdetachNewThreadSelectorを使うといいようです。そこで実装しました。

Button.swift

import UIKit

class Button: UIView {

var target: NSObject?
var action: Selector?

/*
* iOS 8 + Swiftでは、performSelector:withObjectが使えないので、dispatch_afterを使用。
* 引数を持つアクションのケースでは、NSThread.detachNewThreadSelector を使用。
* http://stackoverflow.com/questions/24158427/alternative-to-performselector-in-swift
* Buttonクラスは、AppDelegateクラスの詳細(push:のこと)を知らない。
*/
func myMethod(aSelector: Selector, anObject: NSObject, sender: Button) {
if (anObject.respondsToSelector(aSelector)) {
let delegateObj = anObject as AppDelegate
let delay = 0.02 * Double(NSEC_PER_SEC)
var time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
dispatch_after(time, dispatch_get_main_queue(), {
NSThread.detachNewThreadSelector(aSelector, toTarget:delegateObj, withObject: sender)
})
} else {
println("Warning: does not respond to given selector")
}

}

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func drawRect(rect: CGRect) {
// Drawing code
}
*/

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
self.myMethod(action!, anObject: target!, sender: self)
}
}

そして、AppDelegate.swift

var window: UIWindow?
var indicator: UIView?

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
// Override point for customization after application launch.
self.window?.backgroundColor = UIColor.whiteColor()

var r: CGRect = CGRectMake(100, 100, 44, 44)
indicator = UIView(frame: r)
if (indicator != nil) {
self.window?.addSubview(indicator!)
indicator?.backgroundColor = UIColor.blackColor()
}

r = CGRectOffset(r, r.size.width + 10, 0)
for var i = 0; i < 7; i++ { var bt: Button = Button(frame: r) bt.backgroundColor = UIColor(hue: CGFloat(i)/7.0, saturation: 1.0, brightness: 1.0, alpha: 1.0) bt.target = self bt.action = "push:" self.window?.addSubview(bt) r = CGRectOffset(r, 0, r.size.height) } self.window?.makeKeyAndVisible() return true } func push(sender: Button) { indicator?.backgroundColor = sender.backgroundColor }

引用ページでは、detachNewThreadSelectorのtoTargetの引数は、selfですが、今の場合、ターゲットがAppDelegateなので、Buttun.swiftで、anObject をAppDelegateにキャストして、引数に入れるのがキモです。この実装方法にたどり着くまで、Buttonクラスは、AppDeleagteクラスのpushメソッドの引数のことをどうやって知るのだろうと疑問に思っていました。http://stackoverflow.com/questions/24985716/in-swift-how-to-call-method-with-parameters-on-gcd-main-thread などを参考にすると、anObjectをAppDelegateにキャストすると、Buttonクラスで、AppDelegateクラスにあるpush:メソッドを呼ぶことはできます。しかし、これはButtonクラスがAppDelegateクラスの実装に依存するので、アカンやつです。替わりに、ここで採用した実装方法だと、Buttonクラスは、AppDelegateクラスの詳細な実装、push:メソッドのことを知らないので、ターゲット/アクションデザインパターンになっています。

HTML/JavaScriptとPhoneGapで作るiPhoneアプリ開発入門を読んで

富田 宏昭著「HTML/JavaScriptとPhoneGapで作るiPhoneアプリ開発入門」を土日に11日間かけて読みました。感想は次の通りです。

1. 本の構成、および感想
Chapter_01 PhoneGapについて
PhoneGapの概要、歴史的背景、必要な開発環境の説明など。

Chapter_02 開発環境のインストール
iOS SDKのインストール、PhoneGapのインストール、プロジェクトの作成方法、PhoneGap 2.0.0での変更点の説明。

Chapter_03 HTML+JavaScriptで作るアプリケーション
HTML/CSS/JavaScriptについて、JavaScriptの基本文法とDOMについて、JavaScriptの基本を学びながら「カウンタ」のアプリを作ろう、変数と配列を学びながら「くじびき」のアプリを作ろう、制御構文を使って「かけ算」のアプリを作ろう。
JavaScriptの基本文法を説明しているし、DOMツリーについて、図を使って冗長なほど丁寧に説明しているので、わかりやすい。

Chapter_04 PhoneGapで作るアプリケーション 基本編
PhoneGap/Cordovaでアプリを作るには、Cordova APIの紹介、Storage APIを使って「キッチンタイマー」のアプリを作ろう、Compass APIとCanvasを使って「コンパス」のアプリを作ろう、Geolocation APIとGoogle Maps APIを使って「地図」のアプリを作ろう、Camera APIを使って「カメラ」のアプリを作ろう。
DOMツリーを使って冗長なほど丁寧にソースコードを説明していてわかりやすい。ただし、PhoneGapってどうよと思って、本で勉強している人もいるだろうから、有料のiOS Developer Programへの登録が必要な、実機でしか動かない例を載せるのはどうもなあと感じる。カメラアプリでは、カメラのオプション設定で、sourceType: navigator.camera.PictureSourceType.PHOTOLIBRARY を記述すれば、カメラの機能は使わないで、Photosで写真アルバムを読み込んで、写真を選択してカメラアプリに戻れるので、アプリの他の機能の動作検証はできる。

Chapter_05 PhoneGapで作るアプリケーション 応用編
「jQuery」とCordova Contacts APIを使って「電話帳移行アプリ」を作ろう、外部ライブラリとFile APIを使って画像を加工するアプリを作ろう。
jQueryを使う内容になったら、難易度が上がった。他のjQueryの本を読んだ方が理解が深まるかもしれない。また、2つのアプリとも実機での動作確認が必要だが、「電話帳移行アプリ」に関しては、csvの電話帳データをMacで/Users/ユーザ名/Library/Application Support/iPhone Simulator/6.0/Applications/アプリケーションID/Documents ディレクトリにコピーすれば、シミュレータで動作確認することは可能である。また、後者のアプリはカメラを使ったアプリであるので、基本編と同じようにカメラのオプション設定を行えば、カメラを使わないで、アプリの動作確認ができる。

Chapter_06 PhoneGap開発TIPS
実機での動作確認をするための方法、PhoneGap:Buildの利用方法、JavaScriptライブラリについて、Cordovaアップデート方法について、iOS Developer Licence更新手順。
どの内容も、実際にアプリを開発し、App Storeにアプリを公開するのに役立つものだ。ただし、PhoneGap:Buildに関しては、手元に開発環境、アプリ実行環境がなくても、コーディングして、PhoneGap:Buildにアップロードすれば、アプリがビルドされるというが、手元にSDKのライブラリがないとコーディングしづらいし、Public Appsのアプリケーションは、PhoneGap:Buildに登録していないユーザでもURL直打ちでアクセスし、アプリケーションをダウンロードできるというので、あまり良い点はない感じがする。Private Appsは無料のDeveloperならアプリを1つ公開できるが、Private Appsをいくつも公開するなら、12ドル/月以上必要だ。アプリを各OS向けに開発、公開するなら、それぞれの開発環境を用意した方がコスト的にはいいし、動作検証もちゃんとできるのではと思う。

2. 本ではなくPhoneGapについて感想
jQueryを使わない場合は、UIコンポーネントにアクセスするには、document.getElementById(‘名前’)とし、jQueryを使う場合は、$(‘#名前’)などとしないといけないが、名前は文字列なので、typoの危険性を排除できず、バグが入り込みやすい。あと、本のサンプルEffectorCameraのコーディングで感じたのだが、JavaScriptやjQueryを使うと、関数が多重の入れ子になって、()や{}などの括弧の対応が取りづらく、JavaやObjective-Cに比べ、コーディングにかなりの注意を要する。これはサンプルソースが悪いのか、JavaScriptがそういうものなのかわからないが。
PhoneGapアプリの本を読んだ限りでは、JavaでAndroidアプリを開発、Objective-CでiOSアプリを開発するの比べ、開発が容易とは言いがたい。もちろん、HTMLやJavaScriptでウェブアプリを開発してきた人には使いやすいフレームワークなのかもしれないが。

Titanium Mobileで開発するiPhone/Androidアプリを読んで

北尾雅人著「Titanium Mobileで開発するiPhone/Androidアプリ」を週末に読んできて、今日、読み終わりました。写経しつつ読むことをやりましたが、週末の一日丸一日をかけて、約12日間で読み終わりました。

本を読んでの感想です。

  1. おきまりのHello Worldから始めますが、そのあと、簡単なTwitterクライアントを作って、スクリプトファイルの分割、共通ソースのオブジェクト化、国際化などが出てきます。
  2. 実践的なサンプルアプリは、ユーザ認証やツイート機能、カメラで撮影した画像付きのツイート機能があるTwitterクライアントTinyTweet、食べログAPI、GPS、データベースを使ったアプリTabeNaviで、大変勉強になりました。
  3. ただし、サポートサイトで公開されているサンプルソースが完成版で、途中経過のソースコードがなく、写経、デバッグに苦労しました。本のソースコードでは省略が多かったり、本の先を読んだり、サンプルソース全体を読んでコードを入力しないとアプリが動作しないことがありました。章、節ごとに途中のサンプルソースを公開してよと言いたいです。特に、実行時にレイアウトがおかしなることがあり、コード入力ミスなのかと疑い、時間を食いました。結局、これはTitanuim SDKのバージョンに依存した現象で、レイアウトでwidthを画面幅に設定するなどして解決しました。
  4. データベース操作では、生のsql文を実行していて、Androidに比べ、データベース機能はいまいちだなと思いました。
  5. iOSがターゲットの場合、xib2jsというアプリを使うと、XcodeのInterface Builderで作ったxibファイルからxib2jsでjsファイルを得られると本の付録には書かれていますが、Xcode 4.3ではxibファイルがないようで、それができませんでした。
  6. 付録のモジュールを使う内容は、AdMobの場合ですが、ti.admobフォルダーのコピー先がよく分からず、検証はできませんでした。ただし、AdMobなどの広告をアプリに導入する際は、モジュールが必要かと思いますので、ググる必要があります。
  7. Androidではバックグラウンドで処理を実行するServiceがありますが、それがTitanuim Mobileで利用できるかは、サンプルや簡易リファレンスで出てこなかったので、分かりません。
  8. この本は、API簡易リファレンスがついているので、開発の時は役立ちそうです。

この本ではなく、Titanium MobileでAndroidやiOSアプリを開発することに関しての感想です。

  1. JavaScriptで開発するのは、それが動的言語であるため、コーディングのとき、コードアシストが貧弱で、変数やメソッド、その引数のサジェストがあまりなかったり、全くなかったりして、コーディングミスすると、アプリ実行時でないと分からないです。
  2. アプリの動作がTitanium SDKのバージョンに依存するところがあります。
  3. GUIと処理との分離がされていないため、アプリ実行時でないと、アプリのレイアウトがわからないという欠点があります。
  4. Web APIを利用する場合、取得データがJSONのときは、JavaScriptとの相性がいいため、開発しやすさはあります。
  5. Titanuium Mobileで開発するとき、ターゲットがAndroidの場合、GUIの見かけが貧弱です。本の付録には、JSSを使ったレイアウトの記述がありますが、Androidの場合、それで改善されるかわかりません。

したがって、全体的に考えると、JavaやObjective-Cで開発するのに比べ、開発が楽とは言いがたいです。ただし、同じコードで、AndroidとiOS両方に対応したいときはTitanium Mobileで開発するのもいいかもしれません。

iOSプログラミング入門 – Objective-C + Xcode 4で学ぶ、iOSアプリ開発の基礎読了、感想

大津真著iOSプログラミング入門 – Objective-C + Xcode 4で学ぶ、iOSアプリ開発の基礎を読み終わりました。この本を読む前に、森巧尚著よくわかるiPhoneアプリ開発の教科書 iOS 5 & Xcode 4.2 対応版を読んでいたのですが、オブジェクト指向やメモリー管理についての説明が不十分で、複雑なアプリの開発には知識が不十分だと感じて、大津真氏の本を購入して、読みました。

感想です。

  1. オブジェクト指向について、基本的なことから説明してあります。プロパティ、アクセサメソッド、メソッドの説明をちゃんとしています。@propertyによるアクセサメソッドの宣言、@synthesizeによるアクセサメソッドの生成の説明もしっかりやっています。森巧尚氏の本ではその辺をちゃんと説明していなく、よくわからなかったのが解消されました。また、独自クラスの作り方や、Javaのインターフェースに相当するプロトコルの説明や、実装方法の説明もありました。森巧尚氏の本でよく分からなかったフレームワークのメソッドのシンタックスおよび使用例も説明してあり、こうやって使えばいいんだと理解できます。
  2. @property宣言する際の、値の属性、assign、retain、copyの説明もされています。
  3. ただし、メモリ管理の説明は少なかった。特に、iOS5から導入されたARCについては説明がなかった(というか、この本執筆時に、未導入?)ので、最新のXcodeでプロジェクトを新規作成して、コーディングするときは、本の通りにやると警告が表示されることがあった。
  4. iOSアプリ開発の基礎的な事柄は、大津真氏の本と森巧尚氏の本で得ることができると思います。
  5. 欠点としては、本の内容構成で、ソースコードを写経しずらいことです。写経は途中で諦めて、ダウンロードしたサンプルコードをインポートして、読むにとどめました。

ARCを説明している初学者向けの本はあまりないようで、ググったら、iOS 5 公開記念! Objective-Cのメモリ管理の革命、 ARC 超入門(サンプルはgitHubに公開) を見つけたので、勉強してみることにします。

Titanium Mobileアプリ開発での国際化の際の注意

Titanium Mobileで開発するiPhone/Androidアプリ 北尾雅人著を読んでいますが、アプリの国際化のところでハマりました。strings.xmlファイルを作り、jsファイルで、国際化する文字列を、L(‘keyword’)で置き換えたのですが、アプリを実行すると、国際化した文字列がなくなり、表示されませんでした。プロジェクトを一旦クリーンしてから、再ビルドして、実行すると、文字列が表示され、ちゃんと国際化されました。これはAndroidでの話で、iPhoneではどうかは確認していません。

アプリ開発本を買いました

アプリ開発本を買いました。

  1. iOSプログラミング入門 Objective-C + Xcode 4で学ぶ、iOSアプリ開発の基礎 大津真著
  2. Titanium Mobileで開発するiPhone/Androidアプリ 北尾雅人著

を買いました。

先日、iOSアプリ開発の本として、よくわかるiPhoneアプリ開発の教科書【iOS 5&Xcode 4.2対応版】森巧尚著を読んだのですが、Objective-Cの説明が少ししかなくて、多分、本格的にアプリを開発するにはダメだろうと思い、1番目の本を買いました。3年くらい前にObjective-CやiPhoneアプリの基礎的な勉強はやったことがあるのですが、多分、あれから仕様が変わっているかと思い、新しい本にしました。この本の「はじめに」で、C言語の知識を想定するとありますが、勉強したことがあり、また、ポインタも理解しているので多分大丈夫でしょう。

また、Titanium Mobileに関しては、Titanium Mobile iPhone/Androidアプリ開発入門 小澤 栄一著をやはり読んだ後なんですが、その本では扱われているサンプルが限られていて、本格的にアプリを開発するには、APIの説明にもページをさいている2番目の本がいいと思い買いました。2番目本は、Amazonで低評価をつけているレビューもありますが、先日、Titanium Mobile iPhone/Androidアプリ開発入門を読んであるので、多分大丈夫でしょう。

よくわかるiPhoneアプリ開発の教科書読了、感想

森巧尚著 よくわかるiPhoneアプリ開発の教科書 iOS 5 & Xcode 4.2 対応版 を、写経しつつ、6日かけて読みました。

Amazonでは、☆印4個の高評価を得ています。確かに、基礎的なことが書かれていて、かつ、わかりやすいです。しかし、作るアプリがほとんどすべてテンプレートを基にして作ったもので、実際にAppStoreに出せるような複雑なアプリを作れるようにはならないでしょう。また、Objective-Cについての説明も、1章しかページをさかれていず、例えば、メソッドの表記の仕方がなぜそのようになるのかとか、noatomicとかretainとかの単語の説明が皆無です。Objective-Cについては、他の本で学習した方がいいでしょう。