2

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

假设我有一个名为 gPrefs 的全局变量。它是 Preference Class 类型,是我制作的自定义类。

我在其界面中声明了以下内容......

@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 指针是否会为零?

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

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

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

4

2 回答 2

3
NSURL *theUrl = [openPanel URL];

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

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

于 2013-04-29T03:24:22.907 回答
2

这么强真的只是保留。当您调用gPrefs.masterFolder = theUrl;您正在做的事情时,您将指针设置为与要调用的保持masterFolder相同。因此,在创建时,它的保留计数为 1;设置为 的强属性后,对其进行了调用,这将其保留计数增加到 2。这就是为什么在实例方法完成并且发生 theUrl 的初始自动释放后它不会消失的原因,仍然具有保留计数为 1,因为它被设置为 strong 属性。theUrlmasterFoldertheUrlmasterFoldertheUrltheUrl

现在,如果您将属性设置为弱,您将获得masterFolder存在niltheUrl被正确销毁的行为,autorelease因为它发生了,因为弱只是设置masterFolder为与它相同theUrl但不调用保留。

于 2013-04-29T03:24:10.350 回答