gpt4 book ai didi

objective-c - 强引用( Objective-C )

转载 作者:行者123 更新时间:2023-12-02 05:06:13 24 4
gpt4 key购买 nike

我试图更好地理解强引用,但在我将在下面列出的特定示例的上下文中。

假设我有一个名为 gPrefs 的全局变量。它属于 Preference Class 类型,这是我创建的自定义类。

我在它的接口(interface)中声明了以下...

@property (strong) NSURL            *masterFolder;

这是一个指向 NSURL 对象的指针。我已经给了它(强)引用,这意味着它会一直存在并且不会释放它的内存。

现在假设我在其他地方完全有一个实例函数,如下所示。

- (IBAction)masterDataSelectButtonAction:(id)sender
{
NSOpenPanel *openPanel = [NSOpenPanel openPanel];//creates an open panel.
[openPanel setCanChooseDirectories:YES];
[openPanel setCanChooseFiles:NO];

NSInteger panelResult = [openPanel runModal];

if(panelResult == NSFileHandlingPanelCancelButton){
NSLog(@"masterDataSelectButtonAction -> Cancel Button Pressed");
return;
}

if(panelResult == NSFileHandlingPanelOKButton){
NSLog(@"masterDataSelectButtonAction-> Ok Button Pressed");
NSURL *theUrl = [openPanel URL];
gPrefs.masterFolder = theUrl; //Setting (strong ref) point to local.
[_masterDataLabel setStringValue:[gPrefs.masterFolder absoluteString]];
}
}

如果此人按下面板的 OK 按钮,我将创建一个名为 theUrl 的本地指针实例变量。然后我将全局变量 masterFolder 指针设置为局部实例变量指针。

如果我理解正确,ARC 应该在它认为不再使用时在函数结束时释放对象。

因此应在函数结束时释放该Url。

但是,如果我理解(强)引用,编译器可能足够聪明地意识到,由于我将全局首选项指针更改为不同的指针,它将使内存中的其他指针引用保持事件状态(或保留它)。

如果我没有将我的 masterFolder 指针声明为 (strong),函数结束后 masterFolder 指针是否会为 nil?

我的实验表明,尽管已到达本地实例函数的末尾,但保持它(强)似乎保留了 localInstance 指针的值。

我的问题是为什么?即使 masterFolder 是一个强引用,如果我将它分配给一个 localInstance 指针并且该指针在 Instance 函数的末尾被删除,为什么当我在其他任何地方的实例函数之外再次从它读取时 masterFolder 的值没有 NIL .

我对(强)引用的理解有点(弱)。没有双关语的意思。

最佳答案

NSURL *theUrl = [openPanel URL];

theURL 在函数范围内(或在 if block 内,但这在本例中没有区别)。 theURL 指向的对象在堆上。在函数结束时,当 theURL 超出范围时,堆上对象的引用计数将减 1(因为 theURL 是对的强引用对象。如果此时引用计数变为 0,则对象被释放。在您的情况下,至少有一个对该对象的其他强引用(在您的全局单例中),因此该对象保持事件状态。堆上的对象对任何事物都不是本地的,因此内存不会超出范围。

如果您的全局单例具有弱引用,一旦对象的引用计数达到 0 并且对象被释放,它将自动设置为 nil

关于objective-c - 强引用( Objective-C ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16270561/

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