4

Objective-C を使用していますが、ARC コンパイラでコードをコンパイルするときに、パラメータを指定せずにメソッドを作成して呼び出す方法がわかりません。

これは、非 ARC Objective-C で達成しようとしている種類のものです (これはおそらく間違っています)。

//
//  Dummy.m
//  OutParamTest

#import "Dummy.h"

@implementation Dummy

- (void) foo {
    NSString* a = nil;
    [self barOutString:&a];
    NSLog(@"%@", a);
}

- (void) barOutString:(NSString **)myString {
    NSString* foo = [[NSString alloc] initWithString:@"hello"];
    *myString = foo;
}

@end

ここでドキュメントを読みました: https://clang.llvm.org/docs/AutomaticReferenceCounting.html

そしてここ: https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html

...しかし、コンパイルされたものを取得するのは難しいと感じています。正しいものは気にしないでください。ARC Objective-Cに適した方法で、上記のコードの要点を書き直すことができる人はいますか?

4

1 に答える 1

8

__autoreleasingout パラメータで属性を使用する必要があります。

- (void) barOutString:(NSString * __autoreleasing *)myString {
    NSString* foo = [[NSString alloc] initWithString:@"hello"];
    *myString = foo;
}

プレリリースのドキュメント (NDA のためリンクすることは許可されていません) では、__autoreleasingを 2 つの '*' の中間に配置していますが、次のように機能する可能性があります。(__autoreleasing NSString **)

b元のコードのように、間接ダブル ポインター ( ) を使用することもできません。次のフォームを使用する必要があります。

- (void) foo {
    NSString* a = nil;
    [self barOutString:&a];
    NSLog(@"%@", a);
}

deallocまた、完全に間違っているオブジェクトを直接呼び出しています。メモリ管理ガイドラインを読むことをお勧めします。

于 2011-10-12T14:06:39.973 に答える