1

私はARCを初めて使用しますが、情報が見つからなかった質問はほとんどありません。

コミュニケーションクラスを書いていますが、サードパーティのクラスにプロパティを追加したいと思います。私は自分のcommunicationClass.h:にこのコードを書きました

@interface AFHTTPRequestOperation()

@property (nonatomic, assign) id<TargetProtocol> delegate;
@property (nonatomic, assign) SEL callback;
@property (nonatomic, retain) NSString *requestIdentifier;
@property (nonatomic, assign) int authenticationMode;

@end

プロパティはうまく追加され、私はそれらを使用します。AFHTTPRequestOperation 私の質問は、別のファイル(my)で拡張された場合でも、ARCはこれらのプロパティをリリースしますcommunicationClass.hか?

4

4 に答える 4

0

「はい」と言いますが、これはあなたのために管理されます。これは、を使用してカテゴリでプロパティを管理する方法について説明しているこのブログ記事objc_setAssociatedObject()に基づいています。記事の最後に、著者は次のように述べています。

注:クラスオブジェクト(UIViewオブジェクト)の割り当てが解除されると、そのプロパティ(animationIdentifer)に-releaseメッセージが自動的に送信されます。

だから私はARCがあなたのためにこれをするだろうと思っています。それはあまり権威がありません、私は知っています...

于 2013-01-24T14:04:01.213 に答える
0

問題は、AFHTTPRequestOperationクラスがARCサポートを使用してコンパイルされているかどうかです。答えが「はい」の場合、ARCがこれを処理します。そうでなければ、そうではなく、答えはノーです。

もう1つは、ARCを使用する場合ですretainstrong

于 2013-01-24T13:55:38.373 に答える
0

はい、あなたの内線はARCによって処理されます。

あなたはそれについて心配する必要はありません。

そして、あなたが使用するweakとそれは見栄えがするでしょうstrong@property

于 2013-01-24T14:02:34.093 に答える
0

(カテゴリではなく)クラス拡張を使用して、追加のプロパティを追加しています。クラス拡張は、拡張されるクラスの元のソースコードにアクセスできる場合にのみ使用できます。この場合、おそらくAFNetworkingプロジェクトに含まれるソースコードがあります。

AppleのObjective-Cを使用したプログラミングでは、クラス拡張について次のように述べています。

クラス拡張はカテゴリとある程度類似していますが、コンパイル時にソースコードがあるクラスにのみ追加できます(クラスはクラス拡張と同時にコンパイルされます)。クラス拡張によって宣言されたメソッドは、元のクラスの@implementationブロックに実装されるため、たとえば、CocoaやNSStringなどのCocoaTouchクラスなどのフレームワーククラスでクラス拡張を宣言することはできません。

通常のカテゴリとは異なり、クラス拡張機能は独自のプロパティとインスタンス変数をクラスに追加できます。クラス拡張でプロパティを宣言すると、[...]コンパイラは、プライマリクラスの実装内で、関連するアクセサメソッドとインスタンス変数を自動的に合成します。

これは、クラス拡張によって追加されたプロパティが、元の実装ファイルにある場合とまったく同じように機能することを示唆しています。ただし、ドキュメントには、クラス拡張を元の実装と同時にコンパイルする必要があることが示されています。元の実装ファイルcommunicationClass.hにが含まれていない場合、これがどのように発生するかはわかりません。AFHTTPRequestOperation.m

プロパティが機能していることを考えると、Objective-Cランタイムがプロパティを認識していると想定する必要があります。これは、ARCが正しく機能することを意味している可能性があります。

おそらくこれをテストする価値があります。ARCがプロパティを正しく解放することを確認するために、deallocこのメソッドを使用して追加されたプロパティに格納しているクラスのメソッドにログを追加します。親が破棄されたときにdeallocgetsが呼び出されると、それが機能していることがわかります。

于 2013-01-24T14:14:05.410 に答える