在使用ARC时,我注意到当我的String弱时:
@property (weak, nonatomic) NSString *myString;
然后,如果我要这样做:
self.myString = [[NSString alloc] init];
甚至
[[NSString alloc] initWithString:@""]
Xcode立即警告我“将保留的对象分配给弱属性;对象将在分配后释放”。虽然我可以理解,但由于它的引用计数为0,所以为什么它在没有警告的情况下起作用:
self.myString = @"";
它对ARC有何不同?
答案 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:@""]
时,系统将使用@“”创建一个新字符串,并将其分配到内存堆中。