1. ホーム
  2. iphone

[解決済み】Objective-CやCocoaを書くときに使っているベストプラクティスは何ですか?[解決済み]

2022-05-03 19:50:04

質問

については知っています。 HIG (しかし、Objective-Cを書くとき、より具体的にはCocoa(またはCocoaTouch)を使うときに、どんなプログラミングのやり方をしているのでしょうか。)

どのように解決するのか?

私がやり始めたことで、標準的ではないと思うことがいくつかあります。

1) プロパティの出現により、私はもう "_" をクラス変数 "private" の接頭辞として使用しないことにしました。 結局のところ、もし変数が他のクラスからアクセスされる可能性があるなら、そのためのプロパティがあるべきじゃないでしょうか? 私はいつも"_"という接頭辞がコードを醜くするとして嫌いでしたが、今ではそれを省くことができるようになりました。

2) プライベートなことといえば、プライベートなメソッド定義は、このようにクラスの拡張子の.mファイル内に配置するのがいいですね。

#import "MyClass.h"

@interface MyClass ()
- (void) someMethod;
- (void) someOtherMethod;
@end

@implementation MyClass

なぜ、部外者が気にしないようなことで.hファイルを乱雑にするのでしょうか?空の()は.mファイルのプライベートなカテゴリに対して機能し、宣言されたメソッドを実装しない場合、コンパイル警告を発します。

3) 私はdeallocを.mファイルの一番上、@synthesizeディレクティブのすぐ下に置くようにしました。 deallocするものは、クラスで考えたいことのリストの一番上にあるべきじゃないですか? iPhoneのような環境では特にそうです。

3.5) 表のセルでは、パフォーマンスのためにすべての要素(セル自身を含む)を不透明にすること。つまり、すべてにおいて適切な背景色を設定することです。

3.6) NSURLConnection を使用する場合、原則としてデリゲートメソッドを実装するのがよいでしょう。

- (NSCachedURLResponse *)connection:(NSURLConnection *)connection
                  willCacheResponse:(NSCachedURLResponse *)cachedResponse
{
      return nil;
}

ほとんどの Web コールは非常に単調で、特に Web サービスのコールではレスポンスをキャッシュするのは例外的なことです。 このようにメソッドを実装すると、レスポンスのキャッシュが無効になります。

また、Joseph MattielloによるiPhone特有のTipsも興味深い(iPhoneのメーリングリストに掲載されたもの)。 他にもたくさんありますが、私が考える最も一般的に有用なものです(なお、いくつかの部分は、回答で提供された詳細を含めるために、オリジナルから少し編集されています)。

4) CoreLocationを使用する場合など、必要な場合のみ倍精度を使用する。定数の最後を'f'にすると、gccが浮動小数点数として保存するようになります。

float val = someFloat * 2.2f;

これは、ほとんどの場合 someFloat が実際にダブルである場合、ストレージ上の'val'で精度を失っているので、ミックスモード演算は必要ない。 iPhoneでは浮動小数点数がハードウェアでサポートされていますが、それでも単精度に対して倍精度の演算を行う方が時間がかかる場合があります。 参考までに。

古い携帯電話では、計算のスピードは同じと思われますが、レジスタの中に倍精度よりも単精度の部品を多く入れることができるので、多くの計算では単精度の方が結果的に速くなるのです。

5) プロパティを次のように設定します。 nonatomic . これらは atomic はデフォルトで、合成時にはマルチスレッドの問題を防ぐためにセマフォのコードが作成されます。99%の人はこれを気にする必要はないでしょうし、非アトミックに設定することでコードの肥大化を抑え、メモリ効率も良くなります。

6) SQLite は大きなデータセットをキャッシュするのにとてもとても高速な方法です。例えば地図アプリケーションは、タイルを SQLite ファイルにキャッシュすることができます。最もコストがかかるのはディスクI/Oです。 を送信することで、多くの小さな書き込みを避けることができます。 BEGIN;COMMIT; 大きなブロックの間に 例えば、2秒間のタイマーを使っていますが、これは新しいサブミットごとにリセットされます。このタイマーが切れると、COMMIT; を送信し、すべての書き込みを一つの大きなチャンクで行うようにします。SQLiteはトランザクションデータをディスクに保存し、このBegin/Endラップを行うことで多くのトランザクションファイルを作成することを避け、すべてのトランザクションを1つのファイルにまとめます。

また、SQLがメインスレッドにあると、GUIがブロックされてしまいます。非常に長いクエリを作成する場合は、クエリを静的オブジェクトとして保存し、SQLを別スレッドで実行することをお勧めします。クエリ文字列のためにデータベースを変更するものは、必ず @synchronize() {} ブロックを作成します。 短いクエリの場合は、メインスレッドに残しておくと便利です。

SQLiteの最適化のヒントはこちらです。

http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html