Edit
iPhoneの技術に関する解説

Edit
アプリのディレクトリ構成

<application-home>----AppName.app
                       |
                       |
                       ----Documents
                       |       |
                       |       ----・・・
                       |
                       ----Library
                       |       |
                       |       ----Preferences
                       |       |
                       |       ----Caches
                       |
                       ----tmp

また、XcodeプロジェクトのResourcesグループに登録した画像やサウンドファイル(内部利用)は、この各アプリケーションパッケージ内に保存されている。

Edit
スレッド関係

例外処理とスレッド同期

Edit
Interface Builder(以下IBと呼ぶ)

Edit
単語の説明

Edit
UIkit (iPhone用のフレームワーク)の注意点

Edit
UITextFieldDelegateの注意点

textFieldShouldReturn のような Cocoa Touchフレームワーク上での、テキストフィールドの処理を委譲するためのプロトコル[UITextFieldDelegate]を利用するには、対象クラスに下記の指定が必要。

@interface TestViewController : UIViewController <UITextFieldDelegate>

そうすることで、InterfaceBuilder上のInspectorのConnectionタグの一番下の項目にReferencing Outletsというエリアに、New Referencing Outlet というリンクできる機能があるので、そこからtextFieldにD&Dすることで、delegateを選択することができ、便利なイベント呼び出しを利用できる。textFieldShouldReturnの場合はtextFieldのFocusが外れた場合など。

Edit
UITableViewControllerの挙動

UITableViewControllerのviewWillAppear:メソッドでは、まだデータがロードされていない状態の時にのみ、reloadDataが呼び出される。そのため、オーバライドする場合には[super viewWillAppear:animated];はメソッド最後に呼び出すようにする。

Edit
UIViewの説明

Viewを切り替えて使うようなアプリケーションで切り替え時にUIの値を変更したい時はviewWillAppearでやらなければならないが、メモリ不足などでviewDidUnloadなどが行われた場合には、view表示を行った場合、再度viewDidLoadが呼び出される。このことはviewUnloadで正しくメモリ解放が行われない場合、2重でメモリを確保(メモリリーク)することになる。
(注)loadViewでxibがアプリに読み込まれた以降に、UIパーツの値変更が可能

Edit
UIViewControllwerの注意点

Edit
すべてのクラスにおける注意点

すべてのクラスはUIViewからの継承であるため、frameプロパティが存在する。インスタンスを作成後、必ずこのプロパティを表示しないと画面にview等が表示されないので気をつけること。

Edit
application

Edit
IBを使わずにラベルの表示を行う方法

XcodeのClassの中にアプリケーション名+AppDelegate.mというファイルがある。その中を以下のように編集してみる。

-(void) applicationDidFinishLaunching:(UIApplication *) application {
   CGRect rect = [window frame];   // windowサイズの取得
   UILabel* label = [[UILabel alloc] initWithFrame:rect];  // 大きさ(rect)を指定してラベルの作成
   label.text = @"Hello new World";     // ラベルにテキストを設定
   [window addSubview:label];           // ウィンドウにラベルオブジェクトを追加
   [label release];                     // ラベル変数を解放
   [window makeKeyAndVisible];          // 
}

Edit
一切のIBを利用しない方法

Edit
UIViewオブジェクトの位置

uiview.frame.origin.x                   // 
uiview.frame.origin.y
uiview.frame.size.width
uiview.frame.size.height

Edit
UIViewにおける、frameプロパティと、boundsプロパティの違い

注意点としては、frame.sizeとbounds.sizeは基本的に同じサイズになるが、自分自身が親の座標からはみ出ている場合には、このサイズは変更される。(と思われる)

Edit
Text入力のキーボードの上にボタンや文章、入力フィールドなどを表示

Edit
トラブルシューティング

Edit
UIViewControllerのイベント処理内でtouchesBeganが拾えない

下記のような実装において、autoreleaseでメモリ解放は問題がある。

- (void)viewDidLoad
{
   UIViewController *vc = [UIViewController new] autorelease];
      [self.view addSubview:vc.view];
}

具体的には、上記のようなイベント処理内で、サブコントローカーのvcを作成して、子供としてサブコントローラーのviewを登録するような場合、viewは登録されるものの、vcとして作成されたコントローラ部分は、viewDidLoad関数から出た時点で、autorelease設定により作成したインスタンスがメモリから解放されてしまい、touchesコマンドを受け取れない。そのため、UIViewControllerのクラスを親クラスと持つ独自のクラスを作成し利用する場合には、インスタンス作成時にautoreleaseを設定してはならない。クラス変数として確保し、deallocで解放させるようにする。

Edit
メモリの確保の注意点

オブジェクトの生成は、2つに分けられる。1つは、allocしてオブジェクトを生成。もう一つは、クラスメソッドの内部で作成する。

例1)ユーザー管理型
UIView * view = [[UIView alloc] init];
例2)システム管理型
NSString * name = [NSString stringWithString:@"suzuki yamada"];

例2ではallocを行わず、stringWithStringメソッド内で領域を確保しているため、ユーザーがdeallocを行う必要がない([view release]は必要だが、[name release]はいらない)。逆にこの例2のような作成をしているオブジェクトに、releaseを実行すると、その場で落ちる。

オブジェクト定数
NSStringなどで、ソース中に定数として記述している場合

NSString * str = [NSString stringWithString:@"メッセージ"];

この場合、str.retainCountが「2147483647」という数字になる。これはオブジェクト定数(文字列定数)のため、解放不要というのを表す「NSIntegerのMAX値」が設定される規定の為。

Edit
コンパイルエラー

Edit
EXC_BAD_ACCESSで実行が中止する。

Edit
「プログラムはシグナルを受信しました:“0”」

下記のコマンドで自動プールの中を確認できる。

[NSAutoreleasePool showPools];

Edit
SpringBoard がアプリケーションの起動に失敗しました。エラー:7

plistのBundle identifierの設定が間違えている場合に発生しやすいが、Emulatorをリセット後、再起動を行うと直る場合が多い。

Edit
何をやってもFailed to launch simulated application: Unknown error.でアプリ起動できない。

残念なことにxcodeはかなりバグが多いIDEである。(3.2.4現在)上記のような場合、内部の設定問題をxcodeは自己解決できず、何をおこなっても2度と動かない。基本的には以下の手順で解決する。

  1. ~/Library/Application Support/iPhone Simulator のフォルダを削除する。
  2. Xcodeのメニューのxcode項目の中の「キャッシュを空にする」を実行する。
  3. iPhone シミュレータのメニューのiPhoneシミュレータ項目の中の「コンテンツと設定をリセット」を実行する。
  4. Xcodeのメニューのプロジェクト項目の中の、プロジェクト名を変更する。

これにより、xcode内部のプロジェクト情報が新規で作成され、上記のエラーから回復することができる。

Edit
無いファイルがあると言われる。

アプリケーションにバインドされるファイルは、開発時に実機やシミュレーターなどにコピーされて、アプリケーションから利用されるが、このファイルがゴミのようにテスト機の中に残る場合がある。Simulatorであれば、メニューから設定のリセットを利用することで削除できるが、実機の場合はすべて工場出荷時に戻すという選択しかない。

Edit
実機でxcodeから起動することが出来ない。

Error launching remote program: failed to get the task for processが表示され、実機上で、アプリが起動せず実機でのデバッグができない場合は、Entitlement.plistが指定されている場合がある。例としては、AD-HOC用にdist.plistなどが指定されている。(厳密には、plitsの中の、get-task-allowのチェックがONになっている状況)

また他にも、ProvisioningFileのセットが、Distribution向けになっている場合も起動しない。そのため、Apple Develper Centerから、Development用のProvisioningFileを利用する。

Edit
画面がうまく回らない。

  1. (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation をreturn YES;で設定したか?
  2. ViewControllerの初期化でinitで初期化されていない。(独自で初期化するなら、[super init]か?)
  3. 特定の関数で呼び出したい時。
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotate:) name:UIDeviceOrientationDidChangeNotification object:nil];

Edit
ビルドの関する他の事項

Edit
画像に関するトラブル

Edit
PNG画像を表示すると暗くないか?

理由は、AppleライブラリがPNGを読み込んで画像化する際に、アルファ値をすでに反映したRGBデータに変更しておくため。詳細はここのページを参照のこと。

Edit
OpenGLを使って文字を表示すると遅い。

これは、PowerVR系のチップが、タイルベースアーキテクチャを採用している唯一の弊害であり、対処するには、glTexSubImageなどのテクスチャーの一部書き換え処理回数を極力減らすように設計することだ。

Edit
Xcode

Edit
初期設定

Xcodeには初期設定として行っておくと便利な機能がある。

Edit
ウィンドウをまとめる。

xcodeのウィンドウは他のIDEと違い、やたらとWindowsが表示される昔のタイプのUIを持っているが、xcode単体(プロジェクトは開かず)を立ち上げたときに、環境設定の中の全般タグの中のレイアウトを「オールインワン」にすることで多くのウィンドウを1つに纏めることができる。

Edit
Subversionとの連動

xcodeにおけるsubversionの連動は一応できる。基本的な手順は以下の通り。

  1. サブバージョンサーバーにプロジェクトフォルダ(リポジトリ)を作成する。
  2. xcodeのメニューのSCM項目の中のリポジトリを選択する。
  3. リポジトリウィンドウの「構成」を選択し、先程作成したサーバーの情報(リポジトリ)を入力し、適用を押し無事に接続できているか確認し、認証されましたと表示されれば、そのまま登録する。
  4. xcodeのメニューからプロジェクト項目の中のプロジェクト設定の編集を選び、一般タグの一番上に表示されている「ルートとSCMを構成する」をボタンを押すことで、ローカルプロジェクトと、先程作成したリポジトリ情報をリンクさせる。
  5. その後、xcodeのSCM項目内が変化し、チェックアウトやアップデートを行うことができる。

※注意、ファイルの追加やディレクトリの追加には注意が必要

Edit
SCMが使いづらい使えない時(SCPlugin)

TortoiseSVN的なSubversionクライアントが、ここのSubversionを作っている所から提供されている。残念なことに正式には、SnowLeopardには対応していないが、下記の設定を行うことで利用することが可能。

  1. 上記サイトより、最新のバージョンのSCPluginをダウンロードし、他のアプリと同じようにインストールする。
  2. pkgファイルでインストールされると、以下のファイルがインストールされる。
    /Library/Contextual Menu Items/SCFinderPlugin.plugin
  3. 上記ファイルを右クリックし、パッケージの中身を表示を選択する。その後開いたFinderから以下のファイルを確認する。
    Contents/Resources/SCPluginUIDaemon
  4. 上記のSCPluginUIDaemonファイルを、OSXのシステム環境設定のアカウントを開き、ログイン項目タブを開いた後、その中に、先程のSCPluginUIDaemonを、ドラッグ&ドロップして登録する。
  5. その後、一度、ログアウトしてから再度ログインして、アプリケーションとして登録されているSCTToolBarButtonを、Finderのボタンが並んでいる所(ToolBar)にドラッグ&ドロップすることで、SVNコマンドをそのボタンを通して利用できるようになる。


※注意、ファイル名やフォルダ名に日本語は使えない。フォルダの削除ができない。(snowで利用している場合)の2点が制約事項として存在する。

Edit
参考リンク

Edit
プロジェクト管理

Edit
多言語対応

Xcodeでは、多言語対応するためのファイルを追加することで、多言語の対応を行うことができる。xcodeの左側のプロジェクト構造の中で、新規ファイルを選択し、Resourcesタグを選択することで、Strings Fileという種別のファイルをLocalizable.stringsという名前で作成することで対応可能である。

作成されたファイルを右クリックし「情報を見る」を選択すると、この中にファイルを「ローカライズ可能にする」というボタンがあるので、選択をすることで設定画面が表示される。設定後は、複数の言語ごとのテキスト設定ファイルが作成され、それぞれのテキストにラベルを編集できる。

Localizable.strings (Japanese) のファイルの中
  "Label" = "ラベル";

このように設定することで、プログラム中では以下のように利用できる。

   NSString * str = NSLocalizedString(@"Label",@"");

2つの引数の内、右の @"" はコメント用の文字列であり、設定の必要は特に無い。

※ローカライズを可能にする」ボタンを押すと、プロジェクトファイルの中には、English.lproj と Japanese.lproj という2つのフォルダが作成され、それぞれに先ほどのLocalizable.stringsというファイルが作成される。


Setting bundleの日本語化
システムの設定の所にアプリケーションの設定が行える情報を登録できる、setting bundleだが、en.lproj フォルダは作成されるものの、ja.lproj フォルダがxcodeから作成できない。そこでコマンドラインより、以下のコマンドを実行する。

cd Settings.bundle
cp -r en.lproj ja.lproj


アプリ名の多言語化
基本的には、plistの多言語ファイルである「InfoPlist.strings」を作成する必要があるが、手順・ファイル名ともにシビアな為、下記の手順で追加してほしい。

  1. XcodeのResourcesフォルダ(作っている場合)を右クリックし、ファイルの新規追加から「OSXのResource」の中にある「Strings File」を選び「InfoPlist.strings」という名前で追加する。
  2. 追加された「InfoPlist.strings」を右クリックし「情報を見る」を選び、File EncodingをUTF-16に変え「左下のローカライズ対応にする」ボタンを押す。
  3. タグの「一般」から必要な言語を追加する。
  4. 作成された「english」や「japanese」のファイルに、以下の分をそれぞれ言語分追加。
    CFBundleDisplayName = "アプリ表示名";

Edit
iPhoneとiPad両方が起動するアプリの作成方法

iPhoneとiPadは、同じようでかなり違う。解像度などの問題や外部ディスプレイ、またメモリ容量などいろいろな部分が違うために、両方で起動させるにはそれらをかなり意識して開発する必要がある。

アプリの開発方法には、2つのタイプがあり、1つはアプリをiPhone,iPadの両方で起動できるように内部に両方のリソースをバンドルし、起動時にそれらを切り替えて起動するようにする手法であるUniversalタイプと、ターゲットを2つ作成し別々のアプリとして作成する、Two Device-Specific Applicationの2つがある。

基本的にはiPhoneタイプでプロジェクトを構築し、xcodeの左側に表示されるプロジェクト構成のターゲット登録されている、1つのターゲットを右クリックすると「現在のターゲットをiPad用にアップグレード」という選択が表示される。これを選択することで、ダイヤログが表示され、ビルドタイプを選択できる。Universalタイプを作成したいときは左側のOne Universal Applicationを選択し、Two device-specific Applicationを作成した場合には、右を選択する。

※コンパイルやデバッグのターゲット変更は、xcodeのメニュー -> プロジェクト -> アクティブターゲットの設定、で変更する


その他のプロジェクトファイルの設定について

古い環境には含まれていない Framework を利用している場合
実行時のDynamic Linkerがシンボルのロードに失敗してアプリケーションが起動しない。そのため、アプリの中に対象となるライブラリの同梱指示を行う。具体的には、Xcodeの左メニューのターゲットの対象ターゲットにおいて「バイナリをライブラリにリンク」の中にリストされている、古いframeworkの「役割」を、Required から weak に変更する。

Edit
アプリ起動までの黒画面時に画像を表示

IOSでは、アプリが起動するまでの黒画面のところで画像を表示しておくことができる。やることは簡単で、Default.png (ファイル名は固定)を、Resources フォルダに入れておくだけで、自動的にこのファイルをアプリ起動時に表示してくれる。

Edit
デバッガ

Edit
変数を表示する領域

Edit
特殊なデバッグオプション

NSZombieEnabled
プロジェクトファイル内の実行可能ファイルをダブルクリックで、起動時の引数などを選択できる。ここで引数タブの下の段に、NSZombieEnabled YES と設定し、チェックを選択することで、システムからの呼び出しもエラー表記してくれるようになる。
これは特に、アプリが途中で突然落ちるときなどに効果を発揮する。
NSDebugEnabled
MallocStackLogging
MallocStackLoggingNoCompact

Edit
原因不明の落ちバグの場合

原因が分からない落ちバグにはいろいろあるが主な原因には以下のものがある。

  1. メモリ不足:メインメモリをオーバーしている。
  2. メモリ不足:メモリリーク(Release忘れ等)で確保できるメモリが無くなった。

基本的に、原因の分からない落ちバグはメモリ関係が多い。この場合にはgdbコマンドを利用してメモリのログを見ることで解決する場合もある。xcodeは基本的にgdbを利用しているため、落ちた後に(gdb)というプロンプトが出ている場合は、このプロンプトの後にコマンドを入力する。

例:
(gdb) shell malloc_history 21331 0x9ea1a0

これは、プロセス番号21331番の、メモリ領域0x9ea1a0に関するメモリログを表示する機能となる。これにより、詳細なメモリ管理情報が取得できる。

Edit
設定(Seeting Application)

IOSでは、設定アプリに自分用の設定項目を作ることができる。基本的には以下の手順で設定ファイルを作成し、xcodeに含めることで、設定アプリに自分の設定を増やすことができる。

  1. xcodeのプロジェクトに追加で、IOSのResourceの中にある、Setting Bundleを選択し、Settings.bundle というファイルを作成する。
  2. Settings.bundleには、自動的にRoot.plistと、en.lprojフォルダが作成され、英語対応用の設定ファイルが作成される。日本語はここでは作成できず、自分でフォルダを作成し追加する。
  3. Root.plistの中のPreference Itemが、設定アプリに表示される設定項目になる。(グループ名も項目の1つになることを注意)

Edit
フレームワークの説明とリンク

Edit
Foundation.framework

Edit
NSObject

Cocoaフレームワークにおける最上位に位置するクラス。すべてのオブジェクトの基礎となる。NSObjectのProtocalに関する説明はここ

Edit
NSFileManager

ファイル管理における専用クラス

Edit
NSTimer

Edit
NSTimeInterval

タイマー時間を計算するクラス

NSDate *startTime = [NSDate date];
// 処理
NSTimeInterval elapsedTime = [startTime timeIntervalSinceNow];

これで処理の時間を計ることができる。

Edit
NSMutableArray

メモリ確保の方法により生存期間が違う。

NSMutableArray *ma;
[[ma alloc]init];              // ローカル外でaddObjectできる。
[ma array];                   // ローカル外でaddObjectできない。

これは他項で説明している所有権に関わる問題である。

Edit
NSString

文字データのフォーマットがUnicodeであることから、NSStringには下記の5種類の改行コードを使用することが認められている。通常はLFを利用。

複数の改行コードに対応しているのはいいが、問題はこれらのコードがひとつのNSStringインスタンスに共存可能だということだ。Windows/DOSならCR-LF、Unix系ならLF、旧MacOSならCRとなっている。

その他

コード役割
\t水平タブ
\"二重引用符
\\\自身

Edit
UIKit

日本語リファレンスはここ

Edit
UIView

Edit
UIScreen

主にスクリーン情報を取得するための特殊なクラス。下記のような手順で画面の大きさなどを取得する。

frame = [[UIScreen mainScreen] applicationFrame];  // StatusBarを除いたスクリーン領域
bounds = [[UIScreen mainScreen] bounds];  // スクリーンの大きさを取得
scale = [[UIScreen mainScreen] scale];   // 画面の拡大率(iPhone3GやiPhone4などは解像度が違うため)

ほとんど利用されないが、iPad以降では外部スクリーンを管理できるようになったので、以下のような要領でスクリーン状態を確認できる。

Edit
UIImage

Edit
UIImageView

Edit
UITouch

Edit
UIScrollView

大きな画像を表示させ、スクロールさせたりするための専用view。

Edit
Core Foundation (CFクラス)

Bundleについて、一度ここを読み必要がある。

Edit
CFBundle

Edit
iPhone Simulatorについて

iPhone Simulatorでは、実機と同じように2本の指によるピンチなどの操作も行うことができる。

iPhoneの操作名PCでのマウス操作手順
タップ左クリック
タッチホールド左クリックし押したまま
ダブルタップ左ダブルクリック
スワイプ1.マウスを指定の位置に移動し左クリック
2.左クリックは押したまま
3.マウスを好きな方向に移動してから左クリックを離す
フリック1.マウスを指定の位置に移動し左クリック
2.左クリックは押したまま
3.マウスを好きな方向に、素早く移動し、途中で左クリックを離す
ドラッグスワイプと操作は同じ。アイコンを選んでいるかどうかの違い
ピンチ1.Optionキーを押したままにする
2.希望位置に左クリックを行い円を表示させ
3.マウスを移動させピンチ幅を調整してから左クリックを離す

Edit
サウンドについて

Edit
AVAudioPlayerクラス (日本語はここ)

利用のための初期設定

  1. インストールするべき、Frameworkは、AVFoundation.framework を追加する。
  2. ソースに記述するヘッダーファイルは、#import <AVFoundation/AVFoundation.h> となる。

Edit
iPhoneの着信音専用ファイル

Edit
メール着信音(*.cafファイル)

iPhoneの着信音は *.caf という変わった拡張子を利用した、*.aiff (osxのサウンド形式)ファイルであり、拡張子をリネームしたものである。通常は aiff 形式にファイルを拡張子cafに変更するだけで利用可能。

Edit
音声着信音(*.m4rファイル)

着信音は、40秒以内のAACデータで構成される。m4rは、m4aファイルの拡張子を変更したものであり、作成は容易である。

Edit
コンバート

# afconvert -hf

Edit
開発上のTips

Edit
UIViewのテクニック

Edit
Viewに枠線をつける。

#import <QuartzCore/QuartzCore.h>
[[view layer] setBorderColor:[[UIColor blueColor] CGColor]];
[[view layer] setBorderWidth:2.0];

Edit
Viewのすみを角丸にする。

[[view layer] setCornerRadius:15.0];
[view setClipsToBounds:YES];

Edit
NSString

Edit
文字列の中の改行を削除

改行の削除
NSString *repWord = [[text componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]] componentsJoinedByString:@""];

Edit
ボタン関係

Edit
ボタンの画像をボタンサイズに自動的に合わせる。

※IBの場合は必要がない可能性あり。

UIImage *pushImage = button.imageView.image;
UIImage *stretchImage2 = [pushImage stretchableImageWithLeftCapWidth:12 topCapHeight:12];  
[button setBackgroundImage:stretchImage2 forState:UIControlStateHighlighted];

Edit
ソフトウェアキーボード

Edit
半透明化

UITextField *textField;
textField.keyboardAppearance = UIKeyboardAppearanceAlert; (黒の半透明のキーボード)
textField.keyboardAppearance = UIKeyboardAppearanceDefault; (通常)

Edit
フォーカスの切り替え

[textView resignFirstResponder];  (フォーカス消す。他にtextViewなければ、キーボード消える)
[textView becomeFirstResponder]; (キーボード出現)

Edit
タッチについて

スワイプやピンチについて

Edit
アイコン

iPadやiPhoneでは、アイコンの種類が何種類か準備し、アプリにバンドルする必要がある。

Edit
iPad

機種解像度ファイル名
iPad72 * 72pxIcon-72.png
50 * 50pxIcon-Small-50.png
768 * 1004pxDefault-Portrait.png
1024 * 748pxDefault-Landscape.png
iPad(Retina)144 * 144pxIcon-72@2x.png
100 * 100pxIcon-Small-50@2x.png
1536 * 2008pxDefault-Portrait@2x.png
2048 * 1496pxDefault-Landscape@2x.png
パソコン用512 * 512px(png, jpg共にOK)iTunesArtwrok

Edit
便利なソーステクニック

ここではコーディングやデバッグに便利な記述やテクニックを紹介する。

Edit
デバッグ用

Edit
ログ

通常、NSLogなどを利用してプログラムのトレースなどを行い場合、以下の行をコピーし、メソッドの先頭に入れておくことで、クラス名・メソッド名を表示できる。

NSLog(@"@%@ : [%s]", [self class], _cmd);

Edit
コーディング

Edit
NSValueやNSNumberによるプリミティブ型のラップ

NSArrayなどのオブジェクト型の配列には、通常、プリミティブ型のデータを入れることができない、これはオブジェクト型はすべてNSObjectからの派生で作られているため、オブジェクト管理メソッドおよびプロパティを、プリミティブ型は持たないためである。そこで以下の形でNSValueやNSNumberというオブジェクト型に変換して利用する。

領域などの構造体系

NSValue * val = [NSValue valueWithCGPoint:(CGPoint)point];
NSValue * val = [NSValue valueWithCGSize:(CGSize)size];
NSValue * val = [NSValue valueWithCGRect:(CGRect)rect];
NSValue * val = [NSValue valueWithCGAffineTransform:(CGAffineTransform)transform];

数字など

NSNumber * num = [NSNumber numberWithInt:(int)value];
NSNumber * num = [NSNumber numberWithUnsignedInt:(unsigned int)value];
NSNumber * num = [NSNumber numberWithLong:(long)value];
NSNumber * num = [NSNumber numberWithFloat:(float)value];
NSNumber * num = [NSNumber numberWithDouble:(double)value];
NSNumber * num = [NSNumber numberWithBool:(BOOL)value];

Edit
マルチスレッド:初期型

iPhoneによるマルチスレッドは、メソッドの呼び出し時にそのフロントスレッドではなく、バックスレッド処理を行う設定ができる。

[self performSelectorInBackground:@selector(backGroundProcess:) withObject:arg];

たとえばこれは自分のクラス内のbackGroundProcessというメソットを、バックスレッドで処理させるように指示を出す。簡単で便利ではあるが2つの大きな注意事項がある。

  1. UIの処理はフロントスレッド側で行っているため画面制御をバックスレッドで処理する場合には、そのUI部分の処理だけは、下記の指定でフロントスレッド側に戻す必要がある。
    [self performSelectorOnMainThread:@selector(uiDraw:) withObject:arg waitUntilDone:NO];
  2. 自動プール変数処理を別途記述する必要がある。これはバックスレッドでの変数確保がフロントスレッド側に影響を与えないようにするためであり、必須と考えて良い。
    • マルチスレッドとして呼び出すメソッドの先頭に。
      // 自動メモリ管理登録
      NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    • 同じくメソッドの最後に
      // 自動メモリ管理解放
      [pool release];

Edit
iOS5について

iOS 5で挙動が変わったUI系APIまとめ

Edit
iOS6について

iOS6非互換:NSTimerの挙動

Edit
追加された機能

  1. UIRefreshControl 引っ張って画像を追加更新させる機能
  2. UICollectionView 写真のカタログなどに利用できるビュー
  3. NSHashTable, NSMapTable, NSPointerArray, NSPointerFunctions

Edit
iOS7について

アイコンのサイズ

iOS7sizeiOSsize
Icon.png60pxIcon.png57px
Icon@2x.png120pxIcon@2x.png114px
Icon-40.png40px--
Icon-40@2x.png80px--
Icon-72.pngIcon-72.png72px
Icon-72@2x.pngIcon-72@2x.png144px
Icon-76.png76px--
Icon-76@2x.png152px--
Icon-Small.pngIcon-Small.png29px
Icon-Small@2x.pngIcon-Small@2x.png58px
--Icon-Small-50.png50px
--Icon-Small-50@2x.png100px
iTunesArtwork.pngiTunesArtwork.png512px
iTunesArtwork@2x.pngiTunesArtwork@2x.png1024px

Edit
atomicとnonatomic

atomicにするとロック機構が働くためnonatomicより10倍程度遅くなる。マルチスレッドでアクセスするならatomicにする。nonatomicなプロパティにメインスレッド以外からアクセスすることもできるがデータが破壊される可能性があるため、無理矢理使うなら@synchronizedなど、他のアクセス制御の仕組みが必要。

Edit
国際化

http://www.atmarkit.co.jp/fwcr/design/tool/iphonesdk03/02.html

Edit
便利なツール・ライブラリ

Edit
Three20ライブラリ

Edit
ASIHTTPRequest

http://allseeing-i.com/ASIHTTPRequest/How-to-use

Edit
便利なiPhone用のアプリ

Edit
iPhoneの開発に関するリンク集

Edit
アイコンの登録

iPhoneやiPadではアプリケーションのアイコン登録が必須であり、app.plistの中に、CFBundleIconFiles というフォルダを作成し、機種毎に最適化した複数のアイコンを登録する必要がある。詳しくはリンクを参照。注意:アイコンファイルの最初の文字は必ず大文字にする

※また、iTunes用の512x512の巨大なアイコンは、plistに登録するのではなく、プロジェクト直下(ResourcesやClassなどと同じレベル)に、.png の拡張子を消した「iTunesArtwork」というファイル名で登録する。

Edit
その他のiPhoneに関するリンク

Edit
わからないこと