【问题标题】:Some memory management understanding一些内存管理的理解
【发布时间】:2011-12-28 16:03:41
【问题描述】:

我创建了一个 viewController 的属性,并从 viewController 的 ClassB(A 类)中保留了它。

所以基本上我有@property(非原子,保留)ClassAViewControllerVC,并在主文件中合成。

我有一个 IBAction,我在其中分配 ClassAViewController 并将其推送到导航堆栈上,但我试图分析我应该在哪里释放这个 viewController?

- (IBAction) response {

 ClassAViewControllerVC = [ClassAViewController alloc] initWithNib:@"ClassAViewController" bundle:[NSBundle mainBundle]];

 [self.navigationController pushViewController:self.ClassAViewControllerVC animated:YES]

}

如上所述,在将视图控制器堆叠在导航控制器上之后,是否可以释放视图控制器?

另外,首先为这样的 viewController 设置属性是个好主意吗?我开始注意到如果不使用@property 保留方式,我的应用程序开始崩溃。任何想法或顾虑将不胜感激。

谢谢

【问题讨论】:

    标签: iphone objective-c ios cocoa ipad


    【解决方案1】:

    首先,不,没有必要将这样的对象保存在属性中。如果类稍后需要访问对象,您只需将对象保留在属性中。在这种情况下,我认为一个局部变量就可以了。

    在本例中,您使用alloc 创建一个ClassAViewController,这意味着调用者(此方法)有责任在完成后释放它。

    当您将它添加到导航控制器堆栈时,导航控制器会保留它,因为它保留了对它的引用。

    所以,在这个方法结束时,你应该释放它,但是它被导航控制器保留了,所以它没有被删除。

    代码应如下所示:

    - (IBAction) response {
        ClassAViewController *viewController = [ClassAViewController alloc] initWithNib:@"ClassAViewController" 
                                                                                 bundle:[NSBundle mainBundle]];
    
        [self.navigationController pushViewController:viewController animated:YES]
    
        [viewController release];
    }
    

    附:在 Objective-C 中,以小写字母开头的变量名是约定俗成的。大写的开头字母用于类名,这让我很困惑! ;)

    【讨论】:

      【解决方案2】:

      如果 ClassAViewControllerVC 是 ClassB 的一个字段,你应该在 dealloc 方法中释放它。

      但你可能应该在 init 甚至更好的 viewDidLoad 方法中创建 ClassAViewControllerVC。(注意:如果你在 viewDidLoad 中创建了一些东西,你也需要在 viewDidUnload 中释放它,而不仅仅是在 dealloc 中)

      因为现在每次调用“响应”方法时都会重新创建 ClassAViewControllerVC。 (并且将其存储在属性中没有多大意义)。如果这是你想要的,你可能不应该让 ClassAViewControllerVC 成为你的 ClassB 的一个字段,而只是将它作为响应方法中的局部变量,如下所示:

      - (IBAction) response {
          ClassAViewController *classAViewController = [ClassAViewController alloc] initWithNib:@"ClassAViewController" bundle:[NSBundle mainBundle]];
      
          [self.navigationController pushViewController:classAViewController animated:YES];
          [classAViewController release];
      
      }
      

      【讨论】:

      • Saurabh,这里的问题是,如果我不使用@property 保留,然后按我的标签栏按钮,我的应用程序就会崩溃。这是一个小复杂的 tabbar->navigation (stack) 应用程序。因此,这就是为什么我要提前保留一个对象。
      【解决方案3】:

      解决此问题的最佳方法是将空的 UIViewController 拖放到 ClassB.xib 文件中。创建@property(非原子,保留)ClassAViewControllerVC,连接到空的UIViewController,您只需拖放到classB.xib文件,并将NIB名称更改为A类nib文件名。这将解决所有崩溃的问题,因为您没有分配或释放任何内存。

      【讨论】:

      • 阿米特,但我相信你仍然可以在不将其拖到 xib 文件的情况下实现这一点。此时我在导航控制器之后释放它,但它工作正常而没有显示任何内存泄漏。我担心的是,如果我不在导航堆栈中设置保留属性,为什么它会崩溃。请记住我的导航控制器顶部有一个标签栏控制器。谢谢
      • 你能先试试这个,如果你遇到同样的问题,请告诉我。我认为通过实施这个崩溃问题将会消失。
      猜你喜欢
      • 2021-05-28
      • 1970-01-01
      • 2012-02-09
      • 1970-01-01
      • 2012-03-16
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 1970-01-01
      相关资源
      最近更新 更多