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

时间:2014-06-01 07:43:36

标签: ios cocoa-touch

到目前为止我遇到的所有示例(包括斯坦福播客)都通过将模型声明为视图控制器的属性并从那里使用它来引用模型:

#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; 

似乎比M-V-C更自我.C-V 在混乱之后'关于我自己的作品:

#import "myClass.h"

@implementation ViewController {
MyClass *myObject;
}

-(void)viewDidLoad {
myObject = [[myClass alloc] init]
}
.
.
.
-(void)someMethod{
displayLabel = myObject.myString;

我的问题是;使用第二个例子有危险吗?或者换句话说,它是否能让编译器更轻松地将MODEL与VIEW和CONTROLLER分开?

2 个答案:

答案 0 :(得分:1)

您的两个示例之间有一些不同的实现细节,但它们基本上完全相同。

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

@interface ViewController : UIViewController {
  MyClass *_myObject;
}

// or

@implementation ViewController {
  MyClass *_myObject;
}

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

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

这确实仍然是MVC,但作为UIViewController子类的控制器总是管理至少一个视图。 M组件是您的myObject实例。在大多数图表中,控制器位于那里,管理控制器所拥有的V和M之间的通信

答案 1 :(得分:0)

使用单例或将模型作为控制器的属性也是一生的问题。我更喜欢使用单例作为辅助类(从游戏中心获取数据或从核心数据中获取数据)。单身对于您需要从应用程序中的不同位置访问的内容非常有用(单身人士的生命周期长于视图控制器的生命周期)。但对于依赖于视图控制器的模型,您当然可以将它们用作视图控制器的属性。假设您的应用程序中有十个视图控制器,每个控制器都显示完全不同的内容,将所有可能的视图控制器的所有数据保存在内存中(单个)只是为了让数据准备好,以防用户想看到任何内容视图控制器。在这种情况下,从视图控制器实现中加载模型的数据并将其作为属性保存并不是一种耻辱。这可以保证在视图控制器的生命周期结束时自动释放数据并避免冲突。当您显示从服务器加载的数据时,按住单例数据是有意义的,每次呈现数据时都不需要刷新数据,以减少加载数据所产生的流量。在线程安全方面使用单例可能是危险的,例如当数据从后台线程变异,同时迭代数据源对象以刷新表视图的内容时。单身人士也可以导致紧耦合,应该避免。如果要保持对对象的弱引用,则使用实例变量而不是属性仍然是一个不错的选择,因为如果引用的对象被自动释放,它将自动设置为nil。在这种情况下,弱属性会导致访问不良。