Question

My project use ARC. I tested with the code below:

NSString __weak *string;
@autoreleasepool {
        string = [NSString stringWithString:@"AAA"];
}

NSLog(@"string: %@", string);

I think it output as:

string: (null)

but it actually output:

string: AAA

I don't understand it. What is the effect of __weak?

EDIT:

And this code below:

NSString __weak *string;
NSString __strong *str;
@autoreleasepool {
    str = [NSString stringWithFormat:@"%@", @"AAA" ];
    string = str;
}

NSLog(@"string: %@", string);

It also output as:

string: AAA
Was it helpful?

Solution

NSString __weak *string;
@autoreleasepool {
        string = [NSString stringWithFormat:@"%@", @"AAA"];
}

NSLog(@"string: %@", string);

it outputs as the following what you want.

string: (null)

Thus,

string = [NSString stringWithString:@"AAA"];

is same as

string = @"AAA";

the constant string literal that is not allocated in the heap.

EDITED:

str variable has still strong reference for the autoreleased object.

The following code is what exactly you want.

NSString __weak *string;
{
    NSString __strong *str;
    @autoreleasepool {
        str = [NSString stringWithFormat:@"%@", @"AAA" ];
        string = str;
    }
}
NSLog(@"string: %@", string);

And

NSString __weak *string;
@autoreleasepool {
    NSString __strong *str;
    str = [NSString stringWithFormat:@"%@", @"AAA" ];
    string = str;
}
NSLog(@"string: %@", string);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top