如果我在Swift 4中定义一个单例:
#import "XibViewHolder.h"
@implementation XibViewHolder
- (void)awakeFromNib
{
[super awakeFromNib];
[self xibSetup];
}
- (void)prepareForInterfaceBuilder
{
[super prepareForInterfaceBuilder];
[self xibSetup];
[self.contentView prepareForInterfaceBuilder];
}
- (void)xibSetup
{
if (_nibName == nil) { return; }
UIView* loadedNibView = [self loadViewFromNib];
loadedNibView.frame = self.bounds;
loadedNibView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
[self addSubview:loadedNibView];
self.contentView = loadedNibView;
}
- (UIView*)loadViewFromNib
{
NSBundle* bundle = [NSBundle bundleForClass:[self class]];
UINib* nib = [UINib nibWithNibName:_nibName bundle:bundle];
return [nib instantiateWithOwner:self options:nil].firstObject;
}
@end
呼叫者可以通过public class MySingleton {
static let shared = MySingleton()
}
访问单例实例。
如果我在MySingleton.shared
中添加一个常量字段school
:
MySingleton
呼叫者可以通过public class MySingleton {
static let shared = MySingleton()
let school = School()
}
访问学校。如果所有呼叫者都通过这种方式访问MySingleton.shared.school
,我的iOS应用程序中将只有school
的一个实例吗?
答案 0 :(得分:0)
为什么不为您的学校创建单身人士?
class School {
static let shared = School()
private init() { }
}
每次我打电话给MySingleton().school
答案 1 :(得分:0)
我是否正确,如果所有呼叫者都通过这种方式访问学校,那么我的iOS应用程序中将只有一个School实例吗?
理论上,也许吧。实际上,也许不是。问题在于school
是一个实例属性。您说呼叫者可以说MySingleton.shared.school
—但问题是,他们可能没有。他们也可以说MySingleton().school
。如果这样做,每个说出来的人都会有一个不同的School实例。
答案 2 :(得分:0)
如果所有呼叫者都以这种方式访问school
并且没有创建其他实例,则它将是唯一的实例。
如果School
是一个结构,那么任何将学校对象存储在另一个变量中的尝试都会有效地创建一个新实例。
例如:
var s = MySingleton.instance.school // where School is a struct.
在上文中,s
在概念上与MySingleton.instance.school
是不同的实例,更改其中一个将不反映在另一个中。