如何在iOS iPhone应用程序中使用前向类声明来表示循环依赖?

时间:2014-08-12 17:23:02

标签: ios objective-c

我正在开发一款需要顺序流动的iPhone应用程序,以便我利用用户友好的处理。该应用程序是一个多视图控制器的大循环,用户可以通过该应用程序的各个模块前进。我在主应用程序循环中有一个内部循环,它只包含2个视图控制器,并在用户决定继续进行时结束。

内部双控制器循环是我针对我的问题所针对的。它由一个表视图控制器(对用户的选择应用更改)和一个详细视图控制器(显示更改)组成。目前,我的问题是每次循环进入其中一个视图控制器时增加内存使用量。我听说前向类声明是处理循环依赖的好方法(双控制器循环),但我还没有看到任何适用于我的情况的工作示例。可以在我的情况下使用转发类声明来有效地循环多个视图控制器,如果是,我该怎么办呢?

以下是我认为需要采用的一个例子。这合理吗? (我对objective-c和前向声明概念很新)

TableViewController.h

#import <UIKit/UIKit.h>

@class detailViewController;

@interface TableViewController : UITableViewController
{
    // Stuff for TableViewController object
}

@end

detailViewController.h

#import <UIKit/UIKit.h>

@class TableViewController

@interface detailViewController : UIViewController
{
    // Stuff for detailViewController object
}

@end

3 个答案:

答案 0 :(得分:0)

我不是100%我理解你的项目结构,但这里有一些我可以给你的提示:

您正在讨论两个不同的问题。

保留周期

保留周期可能会导致程序中出现内存问题。当您在应用程序中遇到内存问题(并且正在使用ARC)时,您创建了保留周期的更改很高。这意味着代码中的两个对象各自通过关系相互引用。这将导致两个对象永远留在内存中。在您的应用程序中,似乎TableViewController和DetailViewController强烈地相互引用。如果您只想将信息从一个ViewController传递到另一个ViewController,则应使用 weak 引用:

@property (weak) DetailViewController *detailViewController;

循环依赖

当两个类尝试导入彼此标头时,会发生循环依赖关系。如果A类在其标题中导入B类,而B类在其标题中导入A类,则您将具有无法解析的循环依赖性,因为预处理器将不知道如何导入彼此依赖的Header文件。这可以通过使用前向声明而不是import语句来解决。 但这与内存管理无关。基本上你应该在可能的时候使用前向声明(当你只需要知道某个类存在时)并且只在实际需要知道该类接口的细节时才使用#import语句(子类化,访问.m文件中其他类的属性。

答案 1 :(得分:0)

你的.h文件只是一个公共界面。如果没有包含在.h文件中,您仍然可以让视图控制器的成员彼此可见,而不会忘记其他类。

如果没有公共数据成员依赖于另一个View Controller,您可以考虑在另一个.m文件中包含一个视图控制器.h文件,而不是它的.h文件。这样就可以避免循环依赖。

如您所知,您可以在@interface关键字之后在.m文件中声明私有数据成员。像这样:

2.M:

#import 1.h

@interface 2
{

}

1.M:

#import 2.h
@interface 1
{

}

即使从.h中删除对另一个.h文件的引用也可以解决循环依赖问题。

话虽如此,循环依赖是您需要在编译/构建时处理的事情,并且当您的应用运行时,它与您在两个视图控制器之间导航无关。

假设这是你的问题,并且你面前有一个故事板,你应该考虑:

1 - 将第一个视图控制器嵌入导航控制器

2 - 从第一个到第二个视图控制器创建一个推送segue。使用performSegueUsingIdentifier从第一个VC导航到第二个VC。

3 - 同样,您可以使用popViewController函数从第二个导航到第一个。

这些步骤都不需要您处理循环依赖,您应该read the documentation very thoroughly了解您想要实现的目标。

简而言之,RTFM

答案 2 :(得分:-2)

你知道,我真的认为你只是要求如何弹出和弹出一个视图控制器。这真是微不足道,它将解决你所有的问题。看看吧。

只是关于推送&#34; @class blah;&#34;在文件的顶部 - 是的,无论如何,那样做。这没什么大不了的。如果它没有找到&#34;一个班级,当然,只是把它放进去。

正如大家所解释的那样,你不应该也不应该考虑内存管理&#34;今天在iPhone编程。这无关紧要。