从视图控制器引用模型的方法

到目前为止,我所见过的所有例子(包括斯坦福播客)都通过声明它作为视图控制器的一个属性并使用它来使用它:

#import "myClass.h" // assume it carries a single NSString property @interface @property (nonatomic,strong) myClass *myobject; @end @implementation ViewController -(void)viewDidLoad { self.myObject = [[myClass alloc] init] . . . -(void)someMethod{ displayLabel = self.myObject.myString; 

似乎比MVC更自我.CV。
在混淆了我自己的这个作品之后:

 #import "myClass.h" @implementation ViewController { MyClass *myObject; } -(void)viewDidLoad { myObject = [[myClass alloc] init] } . . . -(void)someMethod{ displayLabel = myObject.myString; 

我的问题是 使用第二个例子有没有危险? 或者以不同的方式提问,它是否使编译器更容易将MODEL与VIEW和CONTROLLER分开?

使用单例或将模型作为控制器的属性也是一个有生之年的问题。 我更喜欢使用单身帮助类(从游戏中心获取数据或从核心数据获取数据)。 单身人士是有用的,你需要从你的应用程序中的不同地方访问(你的单身人士的生命周期比视图控制器的生命周期长)。 但是对于视图控制器相关的模型,你当然可以使用它们作为视图控制器的属性。 假设您的应用程序中有10个视图控制器,每个视图控制器都显示完全不同的内容,将所有可能的视图控制器的所有数据都保存在内存中(单例),只是为了让用户能够看到任何数据的视图控制器。 在这种情况下,从您的视图控制器实现中加载模型的数据并将其作为属性保存并不是件可耻的事情。 这保证了视图控制器的生命周期结束时自动释放数据并避免冲突。 当您显示从服务器加载的数据时,以单例forms保存数据是有意义的,每次显示数据时不需要刷新数据,以减less加载数据所产生的stream量。 使用单例对于线程的安全性可能是危险的,例如,当数据在后台线程中发生变异时,迭代数据源对象以刷新表视图的内容。 单身也可能导致应该避免的紧耦合。 如果你想持有一个对象的弱引用,那么使用一个实例variables而不是一个属性仍然是一个不错的select,因为如果被引用的对象被自动释放,它将被自动设置为nil。 在这种情况下,弱财产会导致访问不良。

在你的两个例子中有几个实现细节是不同的,但它们本质上是完全相同的。

在这两种情况下,你都宣布支持伊娃。 这行@property (nonatomic,strong) myClass *myobject; 会隐式@synthesize myObject = _myObject; ,这与您手动编写相似:

 @interface ViewController : UIViewController { MyClass *_myObject; } // or @implementation ViewController { MyClass *_myObject; } 

唯一的区别是@property (nonatomic,strong) myClass *myobject; 也将为您创build访问器方法

 - (void)setMyObject:(MyClass *)myObject; - (MyObject *)myObject; 

这实际上仍然是MVC,但是UIViewController子类的控制器总是至lesspipe理一个视图。 M组件是你的myObject实例。 如在大多数图表中,控制器位于那里pipe理控制器拥有的V和M之间的通信