gpt4 book ai didi

ios - stringWithFormat和initWithFormat在ARC中导致不同的值

转载 作者:行者123 更新时间:2023-12-01 17:48:53 25 4
gpt4 key购买 nike

我是 objective-c 和iOS的新手。当像下面这样使用NSString stringWithFormat和initWithFormat时,我对2个结果值感到困惑:

NSString* str0 = @"Hello";
__weak NSString* str1 = [[NSString alloc] initWithFormat:@"%@", str0 ]; // warning: Assigning retained object to weak variable; object will be released after assignment
__weak NSString* str2 = [NSString stringWithFormat:@"%@",str0];

NSLog(@"Result: str0 %@, str1 %@, str2 %@", str0, str1, str2);

输出:结果:str0你好,str1(空),str2你好

环顾网络,在ARC示例中,这些 call 者的答案相同: stringWithFormat vs initWithFormat under ARC

但是使用上面的代码,str2似乎在这里无论弱弱都没有意义,即我可以删除__weak of str2声明并得出相同的结果。

我担心的是,如果stringWithFormat创建的字符串归框架所有(或者由用户应用程序范围之外的其他方式拥有)?

最佳答案

我对你问题的回答

如果您想对某个属性具有较弱的属性,则应该有人
已经保留了它

。H

@property (nonatomic, weak) NSString *str1;
@property (nonatomic, weak) NSString *str2;

.m
@synthesize str1,str2;


-(void)viewDidLoad
{
NSString* str0 = @"Hello";
NSString* str1 = [[NSString alloc] initWithFormat:@"%@", str0 ];
NSString* str2 = [NSString stringWithFormat:@"%@",str0];
NSLog(@"Result: str0 %@, str1 %@, str2 %@", str0, str1, str2);
}

输出量
Result: str0 Hello, str1 Hello, str2 Hello

Graver answer here

Apple Forum Document的详细说明

区别在于如何对返回值进行内存管理。
alloc / initWithFormat:返回保留的字符串,您必须
释放或自动释放自己。 stringWithFormat:返回一个字符串
已经自动发布。 (一个自动释放的对象将是
当前自动释放池消失时释放;那通常
在处理下一个事件之前发生。)

您应该使用哪个取决于您对字符串的处理方式。如果
这是一个临时字符串,如果要存储在另一个字符串中
对象,或者是否要使用将该对象存储在您自己的对象中
“self.property”语法,使用stringWithFormat :;如果会
分配给全局,静态或实例变量(不使用
“self.property”),请使用alloc / initWithFormat:。

就您而言,您可以选择任何一种方式。 stringWithFormat:将允许
您删除显式发布调用,但是自动释放也是
比释放慢得多。由您决定是否
您希望您的代码更小,更简单或更长时间。

关于ios - stringWithFormat和initWithFormat在ARC中导致不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38049751/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com