0

2 つの本当に基本的な説明が必要です。

1.

次のように宣言されたメンバーを持つクラス A があるとします。

@property (nonatomic,retain) NSString* stringInstanceVariable;

私のメソッドの 1 つで、stringInstanceVariable を何らかの文字列に初期化したいと考えています。保持する必要がありますか?

私は電話する必要があります:

stringInstanceVariable = [[NSString stringWithCString:"Hello"] retain];

または

stringInstanceVariable = [NSString stringWithCString:"Hello"];

または多分私は電話する必要があります:

self.stringInstanceVariable = [NSString stringWithCString:"Hello"];

2.

インターフェイス ビルダーを使用して、たとえばテキスト フィールド コントロールを右クリックすると、メソッドのリストが表示されます。それらは正確には何ですか?登録して観察できるという通知?そして、IBを使用してそれらを実装して接続できることを知っています。たとえば、コードだけを使用してIBなしでこれを行うことができるかどうか、またその方法を知りたいだけです。「addTarget:action:forControlEvent」を使えばできるかもしれません。

しかし、その場合、Cocoa のイベントと通知の違いは何ですか? または委任と比較する方が適切です。

4

2 に答える 2

0

-stringWithCString実際には、推奨されていないため、それらのどれもありません。

を使用-stringWithCString:encoding:して、null で終わる文字列とNSStringEncoding型を指定します。たとえば、次のようになります。

self.stringInstanceVariable = [NSString stringWithCString:"Hello" encoding:NSUTF8Encoding];

この例では、入力する C 文字列はすべて UTF-8 でなければなりません。アプリケーションによっては、他のエンコーディングが存在する場合があります。

selfプロパティのセッターにアクセスするために使用します。

retainプロパティがこれを処理するため、これを指定する必要はありません。

ただし、 を使用してalloc-initをセットアップする場合NSString、 を使用-initWithCString:encodingして自動解放する必要があります。たとえば、次のようになります。

self.stringInstanceVariable = [[[NSString alloc] initWithCString:"Hello" encoding:NSUTF8Encoding] autorelease];

これは (メモリ管理の観点から) 以下と同等です。

NSString *_tempString = [[NSString alloc] initWithCString:"Hello" encoding:NSUTF8Encoding];
self.stringInstanceVariable = _tempString;
[_tempString release];

これは少し複雑になりますが、後者の方法を好む人もいますが、より多くのコードが必要になり_tempStringますstringInstanceVariable。前者のアプローチでautoreleaseは、最終的に一時変数を解放することになりますが、メモリ プロファイルをタイトに保ちたい場合は、後者のアプローチを検討する必要があります。

于 2010-07-28T22:25:19.733 に答える
0

2番目の質問に答えるためにUITextFieldDelegate protocol、デリゲートが実装することに同意するメソッドの一種の「契約」を指定するがあります(オプションとして指定されていない限り)。

Interface Builder では、View Controller をテキスト フィールドの として結び付けますdelegate。ビュー コントローラーをデリゲートにするということは、テキスト フィールド内またはテキスト フィールドに対して何かが発生したときに呼び出されるオプションではないメソッドをビュー コントローラーに設定することに同意することを意味します。

たとえば-textFieldDidBeginEditing、ユーザーがテキスト フィールドでテキストの編集を開始すると、デリゲートのメソッドが呼び出されます。フィールドのテキスト コンテンツがいつ変更される可能性があるかを追跡するのに役立つ場合は、ここにコードを配置します。(オプションで) 実装できる他のデリゲート メソッドがあります。

デリゲート パターンは、iOS 開発ではどこにでもあります。テーブル ビューも良い例です。コントローラー クラスをインスタンスのデリゲートとして設定しUITableViewます。コントローラーには、テーブル ビューに含まれる行とセクションの数、およびセルの内容を指定する、オプションではないデリゲート メソッドがいくつか含まれています。

通知は、通常、オブジェクトの 1 つのインスタンスのみが別のオブジェクトのデリゲートとして設定されるという点で、デリゲートとは異なります。通知は、複数のオブジェクトが別のオブジェクトで起こっていることをリッスンできるようにする場合に役立ちます。通知センターは、通知をリッスンするために登録されているオブジェクトに通知をブロードキャストします。登録されたオブジェクトは、通知を受信したときにメソッド (Objective-C で言えば「セレクター」) を実行することに同意します。

于 2010-07-28T22:42:28.397 に答える