ラベル Objective-C の投稿を表示しています。 すべての投稿を表示
ラベル Objective-C の投稿を表示しています。 すべての投稿を表示

2012/10/06

iOSアプリの画面遷移 + データの引き継ぎ(激闘編)

こんにちは。最近、本業がプチ炎上しているたーせるです。どうしてこうなったし。

閑話休題。

今日のお便りコーナーは、筑波の学園都市で暮らす ぬっくんから。

というわけで、ぬっくんが挫折したポイントに僕も挑んでみようと思います(下図は、前画面から引き継いだデータを表示するイメージです)。


あ、言い忘れましたが、ぬっくんは GUI ビルダー(Story Board)がお嫌いらしい。


ので、そこらへんも考慮して Story Board 不使用という縛りプレイで、画面遷移時のデータ引き継ぎを実装してみる事にしましょう。

2012/09/21

【Objective-C++】ARCとstd::shared_ptr

季節は、秋である。


僕はRetina MacBook Proを買って以来、iPhone 5を予約したり天国のスティーブジョブズ様に祈りを捧げたりと大忙しで、ブログの更新をサボりがちになっていた。

さて。

そんなAppleの先進的なプロダクトの中核をなす開発言語と言えば、Objective-Cである。

嘗てはC言語の陰に隠れてマイナーなポジションに在った言語であるが、昨今のiPhoe / iPadの普及に伴い、その知名度もようやく上がりつつある。

というわけで、僕もObjective-Cに再挑戦してみようと思い、荻原剛志著『詳解Objective-C 2.0 第3版』なんぞを買ってきて読んで今に至るわけである。

ここから本題であるが、Objective-Cを用いてプログラミングを行う上でネックなポイントが『メモリ管理』であった。この話は去年の3月頃にも一度書いた気がする。

あれから時代は流れ、Objective-Cではメモリ管理を自動化するための ARC (Automatic Reference Counting) という機能が使用できるようになった。もうretainやらreleaseやら手作業でリファレンスカウンタをいじらなくてもよいのだ。

しかし、例えば僕がiPhoneアプリを開発する事になり、UIまわりをObjective-Cで、ロジックをC++でそれぞれコーディングする事にしたとしよう。この場合、UIからロジックにアクセスするために、Objective-C側は何らかの方法でC++側のオブジェクトを参照しておく必要がある。

残念ながらARC は C++ の生ポインタを自動解放してはくれないため、このままではObjective-C側にC++のメモリ解放コードが混在する穢らわしいコードになってしまう。安全性も下がる。たちまちメモリリークが発生し、またたく間にアプリが落ち、やがてApp Storeのレビューには心ないユーザからの罵詈雑言が書き込まれる事だろう。

だが悲観するには早い。

2011年8月12日(僕の誕生日!)に、C++の最新規格であるC++11がISOに承認され、参照カウンタを自動制御できるスマートポインタという仕組みが正式に導入された。

Visual Studioはどうか知らんが、最新のXcode 4.5ではC++11をサポートしている。これでObjective-C、C++ともにメモリ周りにおける懸念がずいぶん軽減された事になる。

しかしながら、ARCはObjective-Cだけの機能であり、スマートポインタはC++だけの機能である。

ここで、一つの疑問が生じた(ほこ×たてっぽく)。

【Objective-CのARCとC++のスマートポインタは共存できるのか】


というわけで、いろいろ実験してみたよー。今日の記事は備忘録的側面が強いので、何言ってるのか分からんという方は読み飛ばして下さい。

1. まずはARCを使ってみる

#import <Foundation/Foundation.h>
#import <cstdio>

/* 宣言部 */
@interface ObjectiveTercel : NSObject
-(id) init;
-(void) dealloc;
@end

/* 実装部 */
@implementation ObjectiveTercel

-(id) init {        // イニシャライザ
    self = [super init];
    printf("[こんにちは]\n");
    return self;
}

-(void) dealloc {   // ファイナライザ
    printf("[さようなら]\n");
}
@end

/* main関数 */
int main(int argc, const char * argv[])
{
    @autoreleasepool {
        ObjectiveTercel* tercel = [[ObjectiveTercel alloc] init];
    }
    return 0;
}


これは適当なクラスを作り、それをインスタンス化するコードである。

main()関数の内部では、インスタンスをポインタ参照している。動的にメモリをアロケートしているため、従来は明示的な解放コードが必要であった。

しかし、上記のコードを実行してみると、@autorelease ブロックを抜けるタイミングで dealloc が呼ばれ、メモリ解放が行われる。実行結果は以下の通りだ。

[こんにちは]
[さようなら]

もちろん、この手品にはタネがあり、ARCのために導入された構文上の制限を守らねばならないのだが。

2011/03/27

Objective-Cで有限オートマトンを作ろう

【ミッション: お買い物プログラムを作れ】

今日は、Objective-C のプロトコルを駆使して有限オートマトン(finite automaton)、別名:有限状態機械(finite state machine)を作りつつ、オブジェクト指向プログラミングに慣れていこうと思う。

とは言ってもそれほど難しいものではなく、今回作るのは、ユーザの入力によって以下のように状態が遷移する、簡単な『お買い物プログラム』だ。
※ 突っ込みどころが満載なのはデフォなので無視してほしい。

最初に断っておくと、状態遷移を管理するプログラムの実装自体は、特別なテクニックが無くとも(一応)可能である。

2011/03/24

Objective-Cのココが苦手(メモリ管理編)

【ミッション: Objective-Cのメモリ管理を覚えよ】

前回のあらすじ: Objective-C の本を買った

せっかくだし、読んでてちょっと苦手だなぁと思ったところを潰していこうと思う。さっそくみんな大好きメモリ管理いってみよう。

一般的なオブジェクト指向言語では、おおむね、メモリのどこかにインスタンスの実体を格納しておくための領域を動的に確保し、そこにポインタ経由でアクセスする事になっている(おなじみ new 演算子はその典型である)。

Java でこの仕組みをある程度意識せずに済んでいるのは、ポインタを意識させないように構文が整備されている事に加え、使用済みのメモリ領域を自動的に解放するガベージコレクションをサポートしているためである。

しかし、iOS は現時点でガベージコレクションをサポートしておらず、iPhone や iPad 向けアプリを作る場合、メモリ管理は避けては通れない。

メモリ管理を疎かにする悪い癖がつかないうちに、この辺りをもうちょっと理解しておきたいと考えた。

2011/03/20

Objective-Cを楽しむ(初級編)

【ミッション: Objective-Cと仲良くなろう】

前回のあらすじ: Objective-C はじめた

でも、始めたばかりでどこから手をつけてよいのか分からない。

行きつけのジュンク堂書店をひたすら徘徊した結果、わかりやすそうな本を見つけたのでつい買ってしまった。

『世界一わかりやすい Objective‐C プログラミングの授業』 ¥2,480 (税別)
これにした理由は、iPhone / iPad アプリ開発に特化していないから。

iPhone アプリを製作できる環境が調っておらず、今のところ言語仕様そのものを学ぶしかないので、混じりっ気のない入門書の中でできるだけ解り易いものを買ってきた。さすが(自称)世界一わかりやすいというだけあって、即日読了。

ただ、ぼくの頭が悪いせいで、わかったようなわからないような。

理解度を確かめるために、先日書いた《ナンバープレイスを解答するプログラム》を Objective-C に移植してみた。

2011/03/18

Objective-Cはじめました

【ミッション: Windows に Objective-C 開発環境を導入せよ】

iPhone アプリ開発者のしゃりんくんのお陰で、ぼくも Objective-C という言語に興味を持ってしまった。これは Apple 製品向け言語であり、iPhone や iPad 向けアプリのほぼ全てが Objective-C で開発されているという。

ぼくは Apple 製品に関してはあくまで一ユーザであり、決してディベロッパではない。そもそも Apple 製品向けアプリの開発には Mac が必要であり、いくらモチベーションが高くとも現状では難しいのだ。

しかし、今は金銭的事情によりすぐには無理でも、将来的には憧れの Mac を手に入れる日が来るかも知れない。

そこで、せいぜい Windows 上に何とかして Objective-C 環境を構築して、文法だけでも勉強してみようかなと思い立った。