一つの関数内で容量の大きなファイルを読み込み加工する処理を連続して行っていたらメモリが足りなくなった。 ARC ではスコープを外れ(て参照カウンタがゼロになっ)たオブジェクトは、すぐに破棄されると思っていたのでしばらくハマった。 問題のソース(ARC使用) ローカルでもWebでも何でもいいけど、ファイルから無視できない程度の容量のデータの読み込みを繰り返す処理。 - (IBAction)buttonDownWithArc:(id)sender { NSString* path = @".../bigdata.img"; for (int i = 0; i < 10000; i++) { NSData* data = [NSData dataWithContentsOfFile:path]; [NSThread sleepForTimeInterval:0.5]; data = nil; }
追記:.plistファイルを経由せずに.csvファイルを直接プログラムから読み込む方法は、 【Objective-C】.plistファイルを経由せず直接.csvファイルからデータを読み込む方法 - 夏までにiPhone アプリつくってみっか! をご参照ください。 現在作成中の縦スクロールシューティングゲームで敵の生成データをどういう形で管理しようか考えているのですが、やっぱりプログラムコードとしてデータを組み込むよりは外部ファイルから読み込むのが良いでしょう。 ということでplistファイルについて調べました。 plistファイルはXcodeのFile>New>FileからResourceを選んで出てくる選択肢の中からProperty Listを選んで作成するができます。そして、それをXcode上で編集することもできるのですが、結構編集に時間がかかります。何か便利な方法はないかと調べたとこ
プログラミング言語でnullは基本的には値がないことや変数が初期化されていないということを表す。 Objective-Cではnilはポインタが何も実体を指していないことを表現し、変数がnilのときオブジェクトを持っていない状態となる。 ただ、NSDictionaryやNSArrayはnilを格納することが出来ず、 空を格納していることを表現するためにNSNullを使う。 nilとNSNullの大きな違いとして、値がnilである変数に対してメッセージを送った場合はnilを返す。nilは(id)0として定義されている。これに対し、オブジェクトがNSNullの場合、NSNullオブジェクトに存在しないメッセージを送るとNSInvalidArgument Exceptionの例外を投げ、これをキャッチしなかった場合はクラッシュしてしまう。 nilへのメッセージの戻り値は次のコードで実験できる。 v
UIViewControllerのライフサイクルについて、何度も調べている気がするので図にまとめてみました。 ※誤った解釈があるかもしれません。お気づきの方は優しくご指摘いただけると僕が喜びます。 init 初期化処理をしている。「init」を読んでいるのに「initWithNibName:bundle:」が呼ばれるのは何故? initWithNibName:bundle: 初期化処理をしているが、初期化するUIViewControllerに紐づくxibファイルがある時に使用する。NibNameにnilを指定して呼び出しても正常に動作する。xibが無い時は「init」を呼べば良いのでnilを指定する意味は無い気がする。 initWithCoder: 初期化処理をしている。どのような時に使用するのが効果的なのか不明? loadView xibを使用しないで、画面の各種Viewをコードで作って
Objective-C のプロパティの属性を指定するとき従うべきガイドラインをまとめた。 できる限り nonatomic を指定する atomic にしてもパフォーマンスが悪化するだけでほとんどメリットがない(参考:StackOverflow - Atomic vs nonatomic properties)。 nonatomic と atomic の使い分けの指針は次のとおり: 参照型: メモリアドレスのみの書き込みなので、常にnonatomicでよい プリミティブ型: int, BOOL等ワンステップでの書き込みが可能: 常にnonatomicでよい 単一のスレッドからしかアクセスされない: 設計に気をつけつつnonatomic推奨 複数のスレッドからのアクセスがあり、long,構造体などサイズの大きい値: atomic推奨 (thx to @takasek) 複数のスレッドから同時に
iOS・Androidアプリのインスタントコード Web開発のためのTipsやチュートリアル 少しは役に立ちたいネタもろもろ 高さを詰めるのにiOS7だとコツがある。 フラットなデザインだからだとは思うんだけど、デフォルトだとセクションヘッダーが大きく見えるようになった。 以下のように、高さが0よりも大きいUIViewが必要。 - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 0.1f, 0.1f)]; return view; } - (CGFloat)tableView:(UITableView *)tableView
データベースを扱うのに CoreDataは便利ですが、大量データの更新や保存をする際にはメインスレッドを妨害しないように別のスレッドで処理する必要があります。 ここでは CoreDataで非同期処理を行うための Tipsを紹介します。 元ネタは Multi-Context CoreData です。より詳しい解説や図解はこちらをどうぞ。 NSManagedObjectContext とマルチスレッド NSManageObjectContext は CoreDataのデータオブジェクトを管理するクラスですが、このクラスはスレッドセーフではありません。このため、マルチスレッドで CoreDataのオブジェクトを扱えるようにするにはスレッドごとに NSManageObjectContextを用意する必要があります。 iOS 5以降では initWithConcurrencyType: に NSPr
Importing data is a problem that feels like it should have a library of work ready for you to use. Especially when it comes to importing data into Core Data where you have a description of your data to work with. What if there was such a library, or reusable framework, of importing code that basically converts raw data to Core Data entities? Well, wonder no further because in this post, I’ll be di
in iOS5.0, using arc, i'm using Magical record to create objects in core data. I have a product object that has a one to many relationship called 'currentPromotions' with Promotion objects. Promotion object has an inverse relationship 'parentProduct', too. I am able to create these objects, but am stymied at how to create the relationship and attach the Promotion objects to the product using Magic
delegateやprotocolの勉強をしたいという人がいるので、なるべくわかりやすくここに書いておこう。propertyとか、delegateっていうのはObjective-Cで楽しいところでもある。 でも、delegateだけじゃなくて、他にもいろいろ非同期的な処理をやる方法あるんで、それも、まとめて説明する。 適当に思いつくだけ書くと、非同期的な処理をするために、Objective-Cでは以下のようなやり方がある。他にもあるかもしれないが、だいたいこれだけある。そして、どれを使ってもいい。 Objective-C、C/C++でも可能 ・関数のアドレスを保持しておいてコールバックする。 ・pthread条件変数を使う。(デッドロックやスレッド管理) ・非ブロッキングI/Oする。(データの検査コスト大、結局カーネル空間からユーザ空間に必要なデータをコピーするときにブロックされる) ・シ
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く