gpt4 book ai didi

iphone - 创建局部变量并赋值给 ivar 和直接赋值给 ivar 之间的区别?

转载 作者:行者123 更新时间:2023-12-03 19:12:58 26 4
gpt4 key购买 nike

我一直想知道为什么所有苹果代码示例都使用这样的代码:

UINavigationController *aNavigationController = [[UINavigationController alloc]
initWithRootViewController:rootViewController];

self.navigationController = aNavigationController;

[self.view addSubview:[navigationController view]];

[aNavigationController release];

他们总是创建一个局部变量并将其分配给 ivar 为什么他们不简单地这样做:

self.navigationController = [[UINavigationController alloc]
initWithRootViewController:rootViewController];;

[self.view addSubview:[navigationController view]];

[navigationController release];

除了更容易理解之外,还有什么原因吗?这是最佳实践吗?

-奥斯卡

最佳答案

您的替换代码不正确,因此说明了 Apple 试图阻止的问题。这是您的代码:

self.navigationController = [[UINavigationController alloc]
initWithRootViewController:rootViewController];

[self.view addSubview:[navigationController view]];

[navigationController release];

你遗漏了“ self ”。在你的引用文献中。也许您打算直接访问 ivar,但在这种情况下,您通过混合访问器和直接 ivar 访问创建了非常困惑的代码(并且在访问器外部使用直接 ivar 访问违反了基本规则)。如果没有,那么你的意思是这样写:

self.navigationController = [[UINavigationController alloc]
initWithRootViewController:rootViewController];

[self.view addSubview:[self.navigationController view]];

[self.navigationController release];

最后一行是非常错误的。切勿将 -release 发送到方法调用的结果。所以不,你这样做的方式不正确。

也就是说,苹果和我在如何做到这一点上存在分歧。我是这样做的:

self.navigationController = [[[UINavigationController alloc]
initWithRootViewController:rootViewController] autorelease;

[self.view addSubview:[self.navigationController view]];

我喜欢 -autorelease 因为我发现它可以防止错误。分配和释放的距离越远,开发人员就越有可能注入(inject)内存泄漏(例如通过添加“返回”)。 autorelease 通过将保留和释放保持在一起来避免这种情况,使将其用作临时变量的意图更加明确,并且通常使代码审查更加容易。

Apple 在他们的示例代码中倾向于不同意我的观点,因为他们通过使用发布而不是自动发布来强调性能。我发现这是错误的优化,因为在任何一种情况下,该对象都不会在此运行循环期间被释放(因此不会保存内存),并且我相信自动释放的非常小的性能损失足以弥补减少由于错误使用release而导致的内存泄漏。

自动释放与释放的争论充满了灰色阴影(我当然直接在循环中使用释放),不同的开发人员有不同的方法,但在任何情况下,您的替换代码都不是正确的方法。

关于iphone - 创建局部变量并赋值给 ivar 和直接赋值给 ivar 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2210916/

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