“使用init将保留对象分配给弱属性”?

时间:2019-01-22 14:46:20

标签: ios objective-c automatic-ref-counting

在使用ARC时,我注意到当我的String弱时:

@property (weak, nonatomic) NSString *myString;

然后,如果我要这样做:

self.myString = [[NSString alloc] init];

甚至

[[NSString alloc] initWithString:@""]

Xcode立即警告我“将保留的对象分配给弱属性;对象将在分配后释放”。虽然我可以理解,但由于它的引用计数为0,所以为什么它在没有警告的情况下起作用:

self.myString = @"";

它对ARC有何不同?

2 个答案:

答案 0 :(得分:2)

由于属性较弱,ARC不会增加引用计数...

所以当您写:

self.myString = [[NSString alloc] init];

ARC紧随其后添加release,因为它与编写相同:

[[NSString alloc] init];

@""的主要区别在于,它是静态字符串,以保留在其他位置的方式...

每次使用@""时,它指向同一对象。

编辑@""[[NSString alloc] initWithString:@""]之间的区别在于,第一个静态字符串,并在编译时进行处理。如果在其他地方使用它,则其他用途将指向相同的静态字符串。第二个在运行时处理。它确实创建了一个具有其保留计数等的新对象。这就是ARC为创建的实例(您专门称为alloc)执行其工作的原因,以及它不关心静态字符串的原因。

答案 1 :(得分:0)

对于'好的,如果执行此操作,为什么它会显示相同的警告:[[NSString alloc] initWithString:@""]? '

使用[[NSString alloc] initWithString:@""]时,系统将使用@“”创建一个新字符串,并将其分配到内存堆中。