__weak and autorelease pool in ARC in Xcode 4.2

送分小仙女□ 提交于 2019-12-10 10:08:31

问题


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

回答1:


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);


来源:https://stackoverflow.com/questions/8306949/weak-and-autorelease-pool-in-arc-in-xcode-4-2

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!