我试图更好地理解强引用,但在下面列出的特定示例的上下文中。
假设我有一个名为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应该在函数结束时释放对象,当它认为它不再被使用时。
因此,应该在函数结束时释放theUrl。
然而,如果我理解(强)引用,编译器可能足够聪明地意识到,由于我将全局首选项指针更改为不同的指针,它将使内存中的其他指针引用保持活动状态(或保留它)。
如果我没有将masterFolder指针声明为(strong),那么函数结束后masterFolder指针会为空吗?
我的实验表明,保持它(强)似乎保留了localInstance指针的值,尽管到达了本地实例函数的末尾。
我的问题是为什么?即使masterFolder是一个强引用,如果我将它赋给一个localInstance指针,并且该指针在实例函数的末尾被删除,为什么当我在实例函数之外的任何地方再次从它读取时,masterFolder的值没有为零。
我对(强)引用的理解有点(弱)。没有双关语的意思。
发布于 2013-04-29 11:24:23
NSURL *theUrl = [openPanel URL];theURL在函数的作用域中(或在if块中,但在本例中没有区别)。theURL所指向的对象在堆上。在函数结束时,当theURL超出作用域时,堆上对象的引用计数将减少1(因为theURL是对对象的强引用。如果此时引用计数变为0,则释放该对象。在您的示例中,至少还有一个对该对象的强引用(在您的全局单例中),因此该对象保持活动状态。堆上的对象对于任何东西都不是局部的,因此内存不会超出范围。
如果全局单例有一个弱引用,那么一旦对象的引用计数达到0并释放对象,它就会自动设置为nil。
发布于 2013-04-29 11:24:10
所以坚强才是真正的留住。当你调用gPrefs.masterFolder = theUrl;时,你要做的就是将指针masterFolder设置为与theUrl相同,并让retain在masterFolder上被调用。因此,当创建theUrl时,它的保留计数为1;由于设置为masterFolder的strong属性,theUrl对它进行了retain调用,从而将它的保留计数增加到2。这就是为什么它不会消失,因为在实例方法完成并且theUrl的初始自动释放发生后,theUrl仍然具有1的保留计数,因为它被设置为strong属性。
现在,如果您将该属性设置为nil,那么一旦它的autorelease发生,您就会得到这样的行为:masterFolder被保留,而theUrl被正确销毁,因为弱只是将masterFolder设置为与theUrl相同,但不对其调用retain。
https://stackoverflow.com/questions/16270561
复制相似问题