首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >强引用(Objective -C)

强引用(Objective -C)
EN

Stack Overflow用户
提问于 2013-04-29 10:54:34
回答 2查看 1.4K关注 0票数 2

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

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

我在它的接口中声明了以下内容...

代码语言:javascript
运行
复制
@property (strong) NSURL            *masterFolder;

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

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

代码语言:javascript
运行
复制
- (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应该在函数结束时释放对象,当它认为它不再被使用时。

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

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

如果我没有将masterFolder指针声明为(strong),那么函数结束后masterFolder指针会为空吗?

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

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

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

EN

Stack Overflow用户

回答已采纳

发布于 2013-04-29 11:24:23

代码语言:javascript
运行
复制
NSURL *theUrl = [openPanel URL];

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

如果全局单例有一个弱引用,那么一旦对象的引用计数达到0并释放对象,它就会自动设置为nil

票数 3
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16270561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档