2010年8月15日日曜日

アプリリリースします。

よっぱらってiMacが来てから早4ヶ月。いろいろ試行錯誤の上、突然会社でiPhoneアプリをリリースするはめに。会社アプリ作成を経て、ようやく個人アプリを全世界に配信です。

巻き紙電卓 Ver1.1

日本語サポートページ
http://mobazoiphone.blogspot.com/2010/08/ver11.html

英語サポートページ
http://mobazoiphoneappen.blogspot.com/2010/08/roll-paper-calculator.html

計算結果を紙のように残すことのできるアプリです。こんな電卓ほしいな、と高校生のころ、文化祭でSHARPのポケットコンピュータPC−1500で作って以来です。

いまの機械で作ると、なんともいえず便利ですね。

現在のバージョンは記憶内容を活用できていませんが、今後機能発展予定です。

現在審査申請中。いつ頃リリースされるのかな? その際はご愛用ください。

iOS4 でバックグラウンド動作を抑止する。

iOS4をターゲットとした場合であっても、初期アニメーションを生かすためバックグラウンドとするのを避けたい場合ですが、info.plistにUIApplicationExitsOnSuspendを追加し、YESとするとバックグラウンドモードに入るのを抑止してくれるようです。その際、表示はApplication does not run in backgroudとなります。

これもなかなか見つけられませんでした。どっかに書いてあるんでしょうけど、基本となるところなので日本語で見やすいところに載せてほしいよなぁ・・・

http://developer.apple.com/iphone/library/documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html#//apple_ref/doc/uid/TP40009252-SW23

iPhoneアプリとして生成し、iPadで使う

iPhone/iPad双方対応は大変です。そこでiPhoneとしてアプリを作成し、iPadのシミュレータで動かしたいところですが、iPhone OS Deployment Targetを3.2にすると、シミュレータはいいのですが、iTunesストアへのアップロードでこけてしまいます。

リリースするには、iPhone OS Deployment Targetを3.1とする必要があるようです。

http://blog.myrss.jp/archives/2010/07/ios4ipad.html

これ見つけるのに一苦労しました。疲れた・・・

2010年8月8日日曜日

NSMutableArray への値の挿入

はまりました。メモリ管理。

NSMutableArrayに値を挿入する場合、MutableArrayが勝ってに保持してくれるものと思っていましたが、そうではないようです。一番最後の行を置き換える場合は、以下のようにコーディングします。

- (void) setInsertLastArray:(NSString *)value{
[tableOfNSArray removeLastObject];
[tableOfNSArray addObject:[value copy]];
}

と、思いましたが、どうもメモリリークが発生しているようです。何がどうなっているのやら。本来はaddObjectでCopyする必要ないですよね。たしかしに、NSArrayをalloc/initしているメソッドではcopyの必要はないです。でもここでcopyをはずすと落ちちゃうんですが・・・わからない・・・・これをやっても落ちます。

releaseしなければ落ちません。でもおかしいですよね。本来NSMutableArray側でRetainするはずですから。うーん・・・


- (void) setInsertLastArray:(NSString *)value{
  NSString *string = [[NSString alloc] initWithString:value];
  [self.tableOfCalcSign addObject:string];
[string release];
}

生成しているメソッドではreleaseしても問題なし。いったん当該メソッドからはずれると追加できない・・・謎。

もしかしてallocした場所以外で編集しようとしても、面倒は見てくれないのかもしれない。そうすると生成後、保存し、また読み出して編集か???? ほんとかよ。それなら出来そうだけど・・・


ーーーーーーーーーーーーー

原因わかりました!! iPhone Developer Program の Forumにあげたところ、メモリ管理の原則を淡々といってくださる方がいて、なやんだけっか、2つのコードの間に、テープルロードのコードがあり、そこでメモリリークが発生しているためでした。

結局 ヘッダファイルでretainしているようなオブジェクトには、allocしたようなものをいれなくても、その場限りで生成したオブジェクト ([NSStirng stringWithString:....];)を代入すれば、保持していることがようやく理解できました。

ふう、つかれたが、これでメモリ管理に自身がつきました。よかった。


2010年8月7日土曜日

NSString の値設定

NSStringの値を設定する場合、メモリ管理を考慮してセットしなくてはなりません。


クラス内共通のNSStringを作る場合は、ヘッダファイルでretainのプロパティ宣言をした上で
@systhesize、dealloc等で解放をコーディングした上で、以下の記載で設定するようです。

これでメモリーリークが無くなりました。他にいい方法があるのかなぁ。
しかし、こんなことをしなくても、簡単にセットする方法を提供してほしい・・・・


-------*.h------------
@interface xxxxViewController : UIViewController {
NSString *Reg1;

}
@property (nonatomic, retain) NSString *Reg1;
@end

-------*.m------------
@implementation xxxxViewController
@synthesize Reg1;

- (void) setReg1:(NSString *)value{
if (Reg1 != value) {
[Reg1 release];
Reg1 = [[NSString alloc] initWithString:value];
}
}

- (void)viewDidUnload {
self.Reg1 = nil;
}

- (void)dealloc {
[Reg1 release];
}
--------------

呼び出し方:

[self setReg1:string];



CoCoaブラウザ

Mac, iPhoneOS3.2, iOS4を含むライブラリを一覧で見ることのできるブラウザです。

検索ができるともっと便利になるかと思いますが、クラスが特定できているときは便利かもしれません。

http://www.macsoft.info/soft/731/cocoa-browser-air.html

2010年8月1日日曜日

AdHocリリース手順

AdHocリリースで散々苦労したので、以下にノウハウを開示します。不十分なところもあるかと思いますので、確認しながら使ってください。



AdHocリリース方法(2010.8月時点)

(0)ディストリビューション証明書を生成/取得する。
a.秘密鍵の生成
Macのキーチェーンアクセスプログラムの「キーチェーンアクセス」−「証明アシスタント」から「認証局に証明書を要求」を選択
AppleIDに登録されているメールアドレスを「ユーザのメールアドレス」に、自分の名前(英字)をコモンネームにニュ力し、「ディスクに保存」と「鍵ペア情報を指定」にチェックを入れ、「続ける」を選択
・保存要求に対し場所を指定し「保存」を選択
・鍵ペア情報として「2048ビット」「RSA」を選択し「続ける」をクリック
・完了画面が表示され、秘密鍵のファイルが出来る。

b.証明書の作成
iPhone Developer Programの右上にあるメンバーセンターにログインし、iPhone Provisioning Portalを選択
Certificatesメニューで、Request Certificateをクリックし、ファイルを選択で先に生成した秘密鍵ファイルを選択する。
・完了するとリストに追加されるためApproveをクリックし、しばらく待つ。
Developmentタグから証明書をダウンロードする。

(1)ディストリビューション証明書を実装する。
Macのキーチェーンアクセスの「自分の証明書」に証明書をドラック&ドロップする。

(注1)デバイスを追加するなどで証明書を変更する際は、証明書を削除した後、iPhoneXcodeを再起動しないとうまく動かない場合があるため注意。

(2)UDIDの取得と登録
PCMacにデバイスを接続
iTunesのデバイスの概要にある「シリアル番号」文字の上をクリック
・識別子(UDID)が表示されるので送付してもらう。
iPhone Developer Programにログインし、Deviceを登録する。

(3)プロビジョニングプロファイルの取得と登録
・登録したデバイスを含むアプリケーションのプロビジョニングプロファイルを設定し、ダウンロードする。
・デスクトップのドックにあるXcodeアイコンにプロファイルをドラックする。

(4)コード署名権限ファイルを作成
Xcodeの「グループとファイル」にあるプロジェクト名の上で右クリックし、「追加」−「新規ファイル」を選択
iPhone OsCode Signingから「Entitlements」を選択し、「次へ」を押し、ファイルを保存する。

(5)ビルドのAdHocモード(構成)を作成し、プロファイルを指定
Xcodeの「グループとファイル」にあるプロジェクト名の上で右クリックし、「情報を見る」を選択
・構成タブにあるReleaseを選択し、下にある「複製」ボタンをクリック
・コピーされた構成名をAdHocに変更
・ビルドタブを選択し、「構成」として「AdHoc」を選択する。
・設定区分のコード署名にあるコード署名IDAny iPhone OS Deviceの値の選択肢から、当該アプリケーション用として表示されている、オーガナイザーに登録された値(Xcode「ウィンドウ」-「オーガナイザー」メニューの「IPHONE DEVELOPMENTDeveloper Profileに表示されるNameと同じもの)を選択する。
・同じくコード署名権限に「Entilements.plist」を入力し、画面をクローズする。

(注2)iPhoneiPadOSバージョンが異なる場合は、以下で設定する。
Deployment
Target Device FamilyiPhoneとする(iPad専用画面を作らない場合)
iPhone OS Deployment TargetiPadOSバージョン(現時点はiPhone OS 3.2)とする。
アーキテクチャ
・ベースSDKiPhoneのバージョンとする(現時点では、iPhoneデバイス4.0

(プロジェクトのビルド設定だけでなく、ターゲットのビルド設定(注3参照)も確認する。

(注3)プロジェクトのビルド設定を変更した場合、ターゲットのビルド設定(「プロジェクト」−「アクティブターゲット〜の編集」のビルドタブ)と一致していない場合があり、一致させる必要がある。

(6)ビルドする。
Xcodeウィンドウの左上にある「概要」からAdHocを選択する。
・ビルドと実行ボタンを押し下げ、ビルドする。

(注4)ビルド時にMinimusOSVersionの指定が要求された場合は、以下の手順による。ただし、通常は要求されず、要求される原因を確認することが望ましい(ターゲットのビルド設定がプロジェクトのビルド設定と合っていないなど)。
・「グループとファイル」のプロジェクトのResourcesにある、「プロジェクト名」-info.plistの行をクリックし、右に現れる+をクリック。追加された行のkeyに「MinimumOSViersion」を入力、valueにサポートしているOSのバージョン「3.2」等を入れる。