Objective-C と Cocoa を書くときに使用するベストプラクティスは何ですか? [closed] 質問する

Objective-C と Cocoa を書くときに使用するベストプラクティスは何ですか? [closed] 質問する

私は知っているハイ(これはかなり便利です!) ですが、Objective-C を記述する場合、具体的には Cocoa (または CocoaTouch) を使用する場合は、どのようなプログラミング手法を使用しますか。

ベストアンサー1

私が始めたことの中には、標準的ではないと思われることがいくつかあります。

1) プロパティの登場により、私は「プライベート」クラス変数のプレフィックスとして「_」を使用しなくなりました。結局のところ、変数が他のクラスからアクセスできる場合は、その変数のプロパティが必要ではないでしょうか。私は常に「_」プレフィックスがコードを醜くするのを嫌っていましたが、今ではそれを省略できます。

2) プライベートなものについて言えば、私は次のようにクラス拡張内の .m ファイル内にプライベート メソッド定義を配置することを好みます。

#import "MyClass.h"

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

@implementation MyClass

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

3) 私は、.m ファイルの先頭、@synthesize ディレクティブのすぐ下に dealloc を配置するようになりました。dealloc する内容は、クラスで考慮したいことのリストの先頭にあるべきではないでしょうか。これは、iPhone のような環境では特に当てはまります。

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

3.6) NSURLConnection を使用する場合、原則として、デリゲート メソッドを実装することをお勧めします。

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

ほとんどの Web 呼び出しは非常に単一であり、特に Web サービス呼び出しの場合、応答をキャッシュする必要があるのは例外的なケースです。示されているようにメソッドを実装すると、応答のキャッシュが無効になります。

また、Joseph Mattiello 氏 (iPhone メーリング リストで受信) からの iPhone 固有の優れたヒントも興味深いものです。他にもたくさんありますが、私が考える最も一般的に役立つヒントは次のとおりです (回答で提供された詳細を含めるために、元の情報から若干編集されている部分もあります)。

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

float val = someFloat * 2.2f;

これは、実際には double である可能性がある場合に最も重要ですsomeFloat。ストレージ上の 'val' の精度が失われるため、混合モードの計算は必要ありません。iPhone のハードウェアでは浮動小数点数がサポートされていますが、単精度に比べて倍精度の計算には時間がかかる場合があります。参考資料:

古い携帯電話では、計算は同じ速度で実行されるはずですが、レジスタ内に倍精度コンポーネントよりも単精度コンポーネントを多く持つことができるため、多くの計算では単精度の方が速くなります。

5) プロパティを に設定しますnonatomic。これらはatomicデフォルトで に設定されており、合成時に、マルチスレッドの問題を防ぐためにセマフォ コードが作成されます。99% のユーザーはおそらくこれについて心配する必要はなく、非アトミックに設定するとコードの肥大化が大幅に軽減され、メモリ効率が向上します。

6) SQLite は、大規模なデータ セットをキャッシュする非常に高速な方法です。たとえば、マップ アプリケーションはタイルを SQLite ファイルにキャッシュできます。最もコストがかかる部分はディスク I/O です。大きなブロック間で と を送信して、小さな書き込みを多数行わないようにしてくださいBEGIN;COMMIT;たとえば、新しい送信ごとにリセットされる 2 秒のタイマーを使用します。期限が切れると、 COMMIT; を送信します。これにより、すべての書き込みが 1 つの大きなチャンクにまとめられます。SQLite はトランザクション データをディスクに保存し、この Begin/End ラッピングを行うことで、多数のトランザクション ファイルの作成を回避し、すべてのトランザクションを 1 つのファイルにグループ化します。

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

SQLite の最適化に関するその他のヒントはここにあります。このドキュメントは古くなっているようですが、ポイントの多くはおそらくまだ有効です。

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

おすすめ記事