Hatena::Groupiphone-dev

haoyayoi Dev Style このページをアンテナに追加 RSSフィード

2009-04-27

AddressBookでのrelease

| 21:25 | AddressBookでのrelease - haoyayoi Dev Style を含むブックマーク はてなブックマーク - AddressBookでのrelease - haoyayoi Dev Style AddressBookでのrelease - haoyayoi Dev Style のブックマークコメント

アドレスブックの参照時に必要なAddressBook関係のクラスですが、随所でみかけるコード記述サンプルには解放する処理が書かれていないため、そのままコピペするとリークしまくる事必死です。

release処理

CoreFoundationのため、CFRelease()を用います。

ABRecordID record;
// many coding
CFRelease(record);

retain処理

CFRetain()を用います。

ABRecordID record;
// many coding
CFRetain(record);

大概の最低限押さえないといけない処理はCFBase.hに書かれてるので、CFRetainとタイプしたあとCommand + ダブルクリックあたりで参照してみるのが早いかもしれないです。

2009-04-16

エリカ本参考時にすこし注意すべきことなど

| 00:27 | エリカ本参考時にすこし注意すべきことなど - haoyayoi Dev Style を含むブックマーク はてなブックマーク - エリカ本参考時にすこし注意すべきことなど - haoyayoi Dev Style エリカ本参考時にすこし注意すべきことなど - haoyayoi Dev Style のブックマークコメント

コードの記述だけでアプリを作る場合、エリカ本は参考になることが多いのですが、そのまま流用するとつまづくこともあります。とくに最初のHelloWorldなど。

このHelloWorldは全部コードのみで記述されているという、IBから離れたい場合に参考になる記事です。たた、ヘッダファイルで宣言している変数までもが全部取り払われているため、アプリ作成でそのまま流用すると「あれ?」と首をひねることになる可能性もあります。そんなことするケースはあまり無いとは思いますが、最初のうちはコピペベースだと思うので要注意です。

IBOutletつけてるIB決別コード

IBの依存を取り除いているのに、なぜかいつまでもIBOutletをつけたままのコードのせたエントリをよく見かけるんですが、やっぱ消し忘れなのかな。

2009-04-14

InterfaceBuilderから決別するほうほう

| 22:52 | InterfaceBuilderから決別するほうほう - haoyayoi Dev Style を含むブックマーク はてなブックマーク - InterfaceBuilderから決別するほうほう - haoyayoi Dev Style InterfaceBuilderから決別するほうほう - haoyayoi Dev Style のブックマークコメント

4月からiPhoneアプリ開発のお仕事に就きました。家でも会社でもobjcな毎日です。

開発上、できるだけソースコードの編集だけで色々な改変を行いたいものですが、割とInterface Builderの呪縛があなどれません。慣れると視覚的ですけど、それでもやはり手間です。

業務の開発をしつつ、IBの依存を消す方法を探した結果、とりあえず形になったのでメモ。

main.m

UIApplicationMain()の最後の引数を、xxxxAppDelegateに書き換えます。

int main(int argc, char *argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, @"HogeHogeAppDelegate");
    [pool release];
    return retVal;
}

info.plist

「Main nib file base name」の行をCut

Controller系

initxxxとviewDidLoad、loadViewあたりを継承

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        // Custom initialization
    }
    return self;
}

- (void)loadView {
    [super loadView];
}

継承しわすれると、画面に何も表示されない場合があるのでほんとに要注意。

多重Controllerの生成

UITabBarController > UINavigationController > UITableViewController という重なり形で生成する場合、UINavigationController内のUITableViewController等のController生成は、UITabBarControllerのinitメソッドか、UIWindow生成時などで一括にて。

やりかたをちょっと誤るだけで、UIViewControllerの無限生成ループが発生することもあります。