Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Out parameters in ARC Objective-C

I'm using Objective-C, and I don't know how to create and call a method with out parameters when compiling the code with the ARC compiler.

This is the kind of thing I'm trying to accomplish in non-ARC Objective-C (this is probably wrong anyway).

//
//  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

I've read the documentation here: https://clang.llvm.org/docs/AutomaticReferenceCounting.html

and here: https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html

...but am finding it difficult to get anything that compiles, never mind anything that is correct. Would anybody be able to rewrite the jist of the code above, in a way that is suitable for ARC Objective-C?

like image 463
Ben Avatar asked Feb 23 '23 17:02

Ben


1 Answers

You need to use the __autoreleasing attribute on the out parameter:

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

The prerelease documentation (which I'm not allowed to link to due to NDA) puts the __autoreleasing in the middle of the two '*'s, but it might just work as (__autoreleasing NSString **)

You also cannot use an indirect double pointer (b) as in your original code. You must use this form:

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

You are also calling dealloc directly on an object which is completely wrong. I suggest you read the memory management guidelines.

like image 182
Mike Weller Avatar answered Mar 05 '23 18:03

Mike Weller