Выходные параметры в ARC Objective C - PullRequest
3 голосов
/ 12 октября 2011

Я новичок в цели C, и я не знаю, как создать и вызвать метод без параметров при компиляции кода с новым компилятором ARC.

Это то, что япытаюсь достичь цели не-ARC C (возможно, это неправильно в любом случае).

//
//  Dummy.m
//  OutParamTest

#import "Dummy.h"

@implementation Dummy

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

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

@end

(отредактировано в соответствии с предложением).

Я прочитал документацию здесь:1008 *http://clang.llvm.org/docs/AutomaticReferenceCounting.html

и здесь: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html

... но мне трудно получить что-либо, что компилируется, не говоря уже о том, что является правильным.Сможет ли кто-нибудь переписать часть кода, приведенного выше, таким образом, чтобы это соответствовало цели ARC C?

1 Ответ

8 голосов
/ 12 октября 2011

Вам необходимо использовать атрибут __autoreleasing в параметре out:

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

Предварительная документация (на которую я не могу ссылаться из-за NDA) помещает __autoreleasing всередина двух '*, но она может просто работать как (__autoreleasing NSString **)

Вы также не можете использовать косвенный двойной указатель (b), как в исходном коде.Вы должны использовать эту форму:

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

Вы также вызываете dealloc непосредственно на объекте, который является абсолютно неправильным.Я предлагаю вам прочитать рекомендации по управлению памятью.

...