小知识点总结(二)
2016-08-21 本文已影响35人
上帝也是码农
1、单例
OC
+(OCSingleton *)shareInstance{
static OCSingleton *ocSingleton = nil;
static dispatch_once_t once_Token;
dispatch_once(&once_Token, ^{
ocSingleton = [[self alloc]init];
});
return ocSingleton;
}
Siwft
1)在Swift里,你可以使用一个简单的static
类型的属性来仅仅初始化一次,在多条线程同时访问时它可以保证只初始化一次。
class Singleton {
static let sharedInstance = Singleton()
}
2)如果你想在初始化的时候执行额外的代码,你可以写成下面这种形式。
class Singleton {
static let sharedInstance: Singleton = {
let instance = Singleton()
// setup code
return instance
}()
}
调用singleton
let singleton1 = CustomSingleton.sharedInstance
print(singleton1)
let singleton2 = CustomSingleton.sharedInstance
print(singleton2)
2、取消按钮高亮状态
将adjustsImageWhenHighlighted
此属性设为NO
3、KVO
1、KVO:Key-value observing键值观察者模式,当一个对象监听的对象的某一属性被改变的时候,该对象会自动被通知。这是一种解耦合的设计模式。
2、实现KVO的三个步骤(Swift)
tip:被监听的对象必须是NSObject的子类
被监听的属性前必须加dynamic
修饰
因为 KVO 是基于KVC(Key-ValueCoding)以及动态派发技术实现的,而这些东西都是Objective-C运行时的概念。另外由于Swift为了效率,默认禁用了动态派发,因此想用Swift来实现KVO,我们还需要做额外的工作,那就是将想要观测的对象标记为 dynamic
(该段为转载,原地址:http://swifter.tips/kvo/)
dynamic var textStr = "gggg"
1)给被监听的对象添加观察者
kvoLabel.addObserver(self, forKeyPath: "textStr", options: .New, context: nil)
2)重写方法: observeValueForKeyPath:ofObject:change:context:
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
print(kvoLabel.textStr)
kvoLabel.text = kvoLabel.textStr
}
3)移除observe
deinit{
kvoLabel.removeObserver(self, forKeyPath: "textStr")
}