2

私はios5でアプリを作ろうとしていますが、なぜこれが起こるのか本当に混乱しています. エラーが表示されたときに行にエラーが発生する理由を説明してもらえますか

ライトバックのために非ローカル オブジェクトのアドレスを __autoreleasing パラメータに渡す

以下の呼び出しはエラーを引き起こします

// note the following method returns _inStream and _outStream with a retain count that the caller must eventually release

if (![netService getInputStream:&_inStream outputStream:&_outStream]) {

 NSLog(@"error in get input and output streams");
 return;
}

私のクラス.h

NSInputStream      *_inStream;
NSOutputStream     *_outStream;

@property (nonatomic, strong) NSInputStream *_inStream;    
@property (nonatomic, strong) NSOutputStream *_outStream;

私のクラス.m

@synthesize _inStream;
@synthesize _outStream;

getInputStreamNSNetServiceクラスのメソッドです

以下の NSNetService クラスの getInputStream 実装をしてください

/* Retrieves streams from the NSNetService instance. The instance's delegate methods are not called. Returns YES if the streams requested are created successfully. Returns NO if or any reason the stream could not be created. If only one stream is desired, pass NULL for the address of the other stream. The streams that are created are not open, and are not scheduled in any run loop for any mode.
*/
- (BOOL)getInputStream:(NSInputStream **)inputStream outputStream:(NSOutputStream **)outputStream;

関連する投稿を見つけました

非ローカルオブジェクトから自動解放パラメータへ

-ポインタ所有権の問題

非ローカル オブジェクトから自動解放

from-ios-4-to-ios-5arc-passing-address

しかし、私は問題を見つけることができません

この問題に関するヘルプは大歓迎です

ありがとう

4

2 に答える 2

6

私は解決策を見つけました

どうぞ。変数をローカルとして作成し、元の変数に割り当てます。洞察に満ちた情報を提供してくれた @borreden に感謝します。

これが私の最新のコードです。

NSInputStream  *tempInput  = nil;
NSOutputStream *tempOutput = nil;

// note the following method returns _inStream and _outStream with a retain count that the caller must eventually release
if (![netService getInputStream:&tempInput outputStream:&tempOutput]) {

    NSLog(@"error in get input and output streams");
    return;
}
_inStream  = tempInput;
_outStream = tempOutput;
于 2012-08-06T10:26:53.000 に答える
0

理由は、 ARC を使用する場合、このようにあなたの_inStreamandを渡すことができないためです。_outStream(変換版ではARCを使用しているため)

これらの変数がメソッド内で上書きされると、リークするためです。

戻り値を処理する (変更された場合) 変更するか、通常のパラメーターとして渡す必要があります。

保持/解放による明示的なメモリ管理はもうないため、ARC はこのケースを自動的に処理できません。

于 2012-08-06T10:06:05.130 に答える