gpt4 book ai didi

objective-c - 深入了解 Objective-C 中强指针和弱指针的实际应用

转载 作者:搜寻专家 更新时间:2023-10-30 19:55:03 25 4
gpt4 key购买 nike

我刚刚阅读了对 this 的公认优秀答案这个问题澄清了 Objective-C 中强指针和弱指针之间的概念差异,我仍在努力理解实际差异。我来自 C++ 背景,那里不存在这些概念,而且我无法弄清楚我应该在哪里使用一个与另一个。

有人可以提供一个使用 Objective-C 代码的实际示例,说明强指针和弱指针的不同用法吗?

最佳答案

概念

一切都与保留计数有关。 ARC 是一种方便,避免开发人员担心手动保留和释放。从本质上讲,强变量会将保留计数增加 1,而弱变量则不会。

见下文:

@interface Test () {
NSString* strongVariable; // Instance variables default to strong
__weak NSString* weakVariable;
}
@end

// This has a retain count of 1, it has been allocated to memory by the user, and stored in a local variable (which is strong)
NSString* str = [[NSString alloc] initWithString:@"Test"];

// The string object will now have a retain count of 2, as the strong variable has increased its retain count
strongVariable = str;

// This weak variable does **not** increase the retain count, and as such it will still be 2
weakVariable = str;

// --

// Now, lets remove some references
// This will reduce the retain count to 1, as a strong variable has lost its link
strongVariable = nil;

// This will also reduce the retain count, as another strong variable has lost it's reference. This means the retain count is 0, and the object can now be considered to not exist
str = nil;

// What happens to weakVariable?
// Because it is referencing an object with a 0 retain count, the runtime will set the value of this variable automatically to nil (iOS 5 and above).
NSLog(@"%@", (weakVariable == nil) ? @"nil" : @"Not nil") // Will print "nil"

您不能遇到强变量引用保留计数为 0 的对象的情况,这违背了强变量的核心概念。值得注意的是,除了 __weak 之外,还有 __unsafe_unretained。这就像一个弱变量,除了它不会在保留计数达到零后自动设置为 nil,这意味着它将包含一个指向内存随机部分的指针(如果你访问它会崩溃,你需要将它设为 nil)你自己)。这是因为 iOS 4 支持 ARC,而不是 __weak。在大多数情况下,您会使用 __weak

以上描述只是实用的一瞥,你可以深入阅读很多using this documentation.

实际应用

默认情况下一切都是__strong。如果你想要弱,你需要使用__weak

当您在概念上不想拥有一个特定对象时,您通常会使用弱变量。虽然汽车拥有它的引擎和车轮,但它不会拥有司机。

Wheel* wheel;
Engine* engine;
__weak Driver* driver;

相反,司机将拥有汽车。

Car* car;

如果汽车拥有司机,我们就会有一个保留周期。汽车拥有司机,司机拥有汽车。如果我们要释放一个,另一个会怎样?保留循环的整个概念超过了这个问题的范围,但你可以 read about it here.

相同的概念适用于编程模式,例如委托(delegate)。对于 TableView , View Controller 将拥有 TableView ,但 TableView 不拥有 View Controller (用作委托(delegate))

//ViewController
UITableView* tableView;
tableView.delegate = self;

//UITableView
@property (nonatomic, weak) id<UITableViewDelegate> delegate;

陷阱

__weak 的一个重要用途是在 block 内。没有它们,您将面临在没有意识到的情况下导致保留周期的严重风险。同样,这超出了这个问题的范围,但是 see here for more information .

类比C++

在 TR1 中,您可以使用共享指针,这些允许您将堆分配的对象放在堆栈分配的对象中,它为我们管理内存。它通过使用引用计数来做到这一点。每次将共享指针传递给另一个变量时,引用计数都会增加。这类似于在 Obj-C 中分配给强变量。

关于objective-c - 深入了解 Objective-C 中强指针和弱指针的实际应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13623884/

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