【发布时间】:2015-07-08 05:16:34
【问题描述】:
我注意到两个视图控制器之间的对象传递在这两个控制器中具有相同的地址。如果我更改控制器 B 中的值,控制器 A 中对象的值会自动更改。 这启发我考虑对象是单例。对于单例设计模式,优点是使用全局有价值来节省系统资源并保持对象的一致性。我的想法是对的吗?有什么区别吗?
【问题讨论】:
标签: ios objective-c swift design-patterns singleton
我注意到两个视图控制器之间的对象传递在这两个控制器中具有相同的地址。如果我更改控制器 B 中的值,控制器 A 中对象的值会自动更改。 这启发我考虑对象是单例。对于单例设计模式,优点是使用全局有价值来节省系统资源并保持对象的一致性。我的想法是对的吗?有什么区别吗?
【问题讨论】:
标签: ios objective-c swift design-patterns singleton
这是关于设计的。
在viewControllers之间使用对象传递时,只有两个viewControllers可以访问对象。
但是,当使用单例时,应用程序的每个地方都可以访问实例。
【讨论】:
单例设计模式确保给定类只存在一个实例,并且该实例有一个全局访问点。它通常在第一次需要时使用延迟加载来创建单个实例。
Apple 经常使用这种方法。例如:[NSUserDefaults standardUserDefaults]、[UIApplication sharedApplication]、[UIScreen mainScreen], [NSFileManager defaultManager] 都返回一个 Singleton 对象。
有关单例设计模式的更多信息,请访问Link
【讨论】:
在Objective-C 或swift 中,所有你称之为“对象”的东西都是指向对象的指针。它不是 C++ 术语中的对象,而是 C++ 术语中的指针。
因为变量是指针,所以你用变量来调用函数,指针是被复制的,而不是被指向的对象。
但在 Objective-C 中存在一个 C 对象(结构(例如 CGSize)和简单变量(int、float ...)),如果您使用它们来调用函数,这些变量将被复制。
关于属性:属性是方法(设置和获取,如果属性不是只读的)。
如果属性有参数strong(保留):
@property (strong) NSObject* a
那么它的属性可以像函数一样实现:
- (void)setA:(NSObject*)a
{
_a = a;//or [_a release]; _a = [a retain]; if no ARC
}
如果属性有参数副本:
@property (copy) NSObject* a
那么它的属性可以像函数一样实现:
- (void)setA:(NSObject*)a
{
_a = [a copy];//or [_a release]; _a = [a copy]; if no ARC
}
属性是一种方法!
您可以创建任何对象类的多个实例:
NSObject* a = [[NSObject alloc] init];
NSObject* b = [[NSObject alloc] init];
a 和 b 指向 memory 中不同对象的指针。
但是如果你不分配 b 对象:
NSObject* a = [[NSObject alloc] init];
NSObject* b = a;
a 和 b 指向内存中的一个对象。
关于单例:the singleton pattern is a design pattern that restricts the instantiation of a class to one object。
【讨论】: