gpt4 book ai didi

ios - 在 ios 上分配属性会发生什么

转载 作者:行者123 更新时间:2023-11-28 22:03:49 25 4
gpt4 key购买 nike

我在头文件中声明了两个属性:
@property(strong)NSString *p1;
@property(assign)NSString *p4;
现在在实现文件上,我写了两个方法来测试分配属性:

- (void)testAssign {
NSString *rawString = @"Hello, ";
NSString *resultString = [rawString stringByAppendingString:@"World"];
self.p4 = resultString;
resultString = nil;
(@"My group is %@", self.p4);

}

在这个场景会报错。

但是当代码如下时,这样做很好:

- (void)testString {
NSString *rawString = @"Hello, ";
NSString *resultString = [rawString stringByAppendingString:@"World"];
self.p4 = resultString;
self.p1 = resultString;
NSLog(@"now result is %@, %@", self.p4, self.p1);
resultString = nil;
NSLog(@"now result is %@, %@", self.p4, self.p1);
self.p1 = nil;
NSLog(@"now result is %@, %@", self.p4, self.p1);
}

结果是:

2014-06-29 19:10:55.798 TestDemo[20853:303] now result is Hello, World, Hello, World
2014-06-29 19:10:55.798 TestDemo[20853:303] now result is Hello, World, Hello, World
2014-06-29 19:10:55.799 TestDemo[20853:303] now result is Hello, World, (null)

第二个片段发生了什么?为什么没有报错?

最佳答案

由于使用分配属性并释放它指向的对象,您在第一个片段中收到访问冲突。

你没有在第二个片段中得到一个,即使它应该有同样的问题——局部变量引用和强属性引用都为空,这应该留下一个无效指针。

我怀疑这只是与编译器优化和时序有关。如果我在调试器中单步执行,两个代码片段都可以正常工作,表明单步过程也在改变一些事情。

在第二种情况下,如果您继续访问 p4,您将看到最终崩溃,我通过在我的应用程序委托(delegate)中调用您的代码 didFinishLaunching 然后访问 self.p4 来确认 来自 willResignActive。启用 Zombies 使其更加清晰 - 在这两种情况下都是“发送到已释放实例的消息”。

在 ARC 下,weak 是首选,因为这会将无效引用替换为“nil”——您仍然会遇到错误,但不会崩溃。

另见 - Objective-C ARC: strong vs retain and weak vs assign

关于ios - 在 ios 上分配属性会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24475582/

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