到目前为止,我所遇到的所有示例(包括Stanford播客)都通过将模型声明为View Controller的属性并从那里开始使用来引用模型:
#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;
C-V比M-V-C更像是自我。
在我自己搞定之后,这个作品:
#import "myClass.h"
@implementation ViewController {
MyClass *myObject;
}
-(void)viewDidLoad {
myObject = [[myClass alloc] init]
}
.
.
.
-(void)someMethod{
displayLabel = myObject.myString;
我的问题是;使用第二个例子有什么危险吗?还是换个角度问,它是否使编译器更轻松地使MODEL与VIEW和CONTROLLER分开?
最佳答案
使用单例或将模型作为控制器的属性也是生命周期的问题。我更喜欢将单例用于助手类(从游戏中心获取数据或从核心数据获取数据)。单例对于您需要从应用程序中不同位置访问的东西很有用(单例的寿命比视图控制器的寿命更长)。但是对于依赖于视图控制器的模型,您当然可以将它们用作视图控制器的属性。假设您的应用中有十个视图控制器,每个视图控制器显示完全不同的内容,那么将所有可能的视图控制器的所有数据都保存在内存中(单例)绝对没有道理,只是为了在用户希望查看任何内容的情况下准备好数据视图控制器。在这种情况下,从视图控制器实现中加载模型的数据并将其作为属性保存就没有什么可耻的。这样可以确保在视图控制器的生命周期结束时自动释放数据,并避免冲突。当显示从服务器加载的数据时,将数据保持为单例是有意义的,而每次提交数据时都不需要刷新该数据,以减少通过加载数据而产生的流量。就线程安全而言,使用单例可能很危险,例如在迭代数据源对象以刷新表视图的内容时从后台线程对数据进行更改时。单例也可能导致紧密耦合,应避免。如果要保留对对象的弱引用,使用实例变量而不是属性仍然是一个不错的选择,因为如果引用的对象自动释放,则该对象会自动设置为nil。在这种情况下,较弱的属性会导致访问不畅。
关于ios - 从 View Controller 引用模型的方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23977747/