【问题标题】:Objective-C: self = nil doesn't set instance to null valueObjective-C:self = nil 不会将实例设置为空值
【发布时间】:2011-10-09 17:19:39
【问题描述】:

我得到了下一个代码,非常简单:

//SecondViewController.m
if(contentRvController==nil){
    contentRvController = [[ContentView alloc] 
    initWithNibName:@"ContentView" bundle:nil]; //ContentView is a custom UIViewController
    ....
    [self.view addSubview:contentRvController.view];
}
else{
    contentRvController.view.hide = YES;
    [contentRvController release];
    contentRvController = nil;
}

基本上,当从一个按钮启动代码时,如果 UIViewController 不存在,则创建一个并显示它(它旨在显示在更大的主桌面视图上,这是 SecondViewController 视图)。如果已打开,请将其关闭并删除以释放资源。

现在,contentRvController 是 ContentView 的一个实例,一个自定义 UIViewController。它有自己的关闭 UIButton,其中 IBAction 是这样的:

//ContentView.m
- (IBAction) closeView {
    self.view.hidden = YES;
    [self release];
    self = nil;
}

现在,当从 SecondViewController 触发时,释放 contentRvController 工作正常(或者在我看来是这样),视图出现并消失。但是当点击 ContentView 关闭按钮时,它也会关闭视图,但是当尝试再次打开它时,if(contentRvController==nil) 返回FALSE,所以我必须点击两次按钮才能再次显示 ContentView。

在我看来,self = nil;contentRvController = nil; 的工作方式不同,尽管它应该都指向同一个地方,我迷失了这个。

¿有什么想法吗?来自墨西哥的欢呼

【问题讨论】:

    标签: objective-c ios cocoa-touch self


    【解决方案1】:

    它们的工作方式相同,但它们并没有像您认为的那样做。 = 不影响对象;它影响指向对象的变量。将一个变量设置为 nil 不会改变程序中任何其他变量的值。同样:

    int a = 5;
    int b = a;
    b = 6;
    printf("A is %d and B is %d\n", a, b);
    

    这将打印“A is 5 and B is 6”——因为将 B 设置为新值不会改变 A 的值。

    【讨论】:

    • 我明白了,但是因为在这种情况下self不应该与 contentRvController 相同,后者是 ContentView 的一个实例?那我该怎么办.-. ?
    • 不;你不明白。 :) contentRvController 是对象地址的副本。就像self 是一个包含对象地址的副本 的局部变量。这两个变量是完全解耦的;彼此无关。改变一个不会改变另一个。
    • 啊哈,我看到了 xD,我想我需要睡觉了,因为那个愚蠢的错误。最后我找到了一个解决方法(ContentRvController == nil || ContentRvController.view.hidden == YES) 不是我最初打算做的,但它确实有效。猜猜接下来要做的是适当的内存释放。
    【解决方案2】:

    任何对象都不应该释放自己。处理对象的正常方法是在释放任何 ivars 的地方实现 -dealloc,然后像这样调用 [super dealloc]。

    - (void) dealloc; {  
    
    [someIvar release];  
    [someOtherIvar release];  
    [super dealloc];  
    }  
    

    您绝对应该退后一步,仔细阅读 Objective-C 中的对象生命周期,否则会有一大堆错误在等着您。 Apple 的 iOS 视图控制器编程指南 并不长。只是谷歌的那个标题。省去很多麻烦。

    【讨论】:

    • "没有对象应该释放自己。"这不是真的。 init 被允许释放自己并返回一个不同的对象。
    猜你喜欢
    • 1970-01-01
    • 2013-06-13
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    相关资源
    最近更新 更多