首页 > 代码库 > Object-C知识点 (三) 单例

Object-C知识点 (三) 单例

#pragma mark - 单例方法(完整的方法)
系统的单例方法名称 sharedApplication defaultManager standardUserDefaults currentDevice

[UIApplication sharedApplication];

[NSFileManager defaultManager];

[NSUserDefaults standardUserDefaults];

[UIDevice currentDevice];

+ (instancetype)sharedInstace;

// 用来保存唯一的单例对象
static id _instace;

+ (id)allocWithZone:(struct _NSZone *)zone
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instace = [super allocWithZone:zone];
});
return _instace;
}

+ (instancetype)sharedInstace
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instace = [[self alloc] init];
});
return _instace;
}

- (id)copyWithZone:(NSZone *)zone
{
return _instace;
}

- (id)retain { return self; }
- (oneway void)release { }
- (id)autorelease { return self;}
- (NSUInteger)retainCount { return 1;}

 

#pragma mark--蒙板(遮罩层)

//1、添加蒙板(遮罩)
UIButton * coverButton = [[UIButton alloc] initWithFrame:self.view.bounds];

coverButton.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.5];

[coverButton addTarget:self action:@selector(tapcoverButton:) forControlEvents:UIControlEventTouchUpInside];

coverButton.alpha = 0.0;

[self.view addSubview:coverButton];

//2、将需要放大的图像按钮弄到最前面
//bringSubviewToFront
[self.view bringSubviewToFront:self.iconButton];

//3、动画放大图像按钮
CGFloat width = self.view.bounds.size.width;

CGFloat height = width;

CGFloat y = (self.view.bounds.size.height - height) * 0.5;

[UIView animateWithDuration:1.0 animations:^{

self.iconButton.frame = CGRectMake(0, y, width, height);

coverButton.alpha = 1.0;
}];

[UIView animateWithDuration:1.0 animations:^{

//将图像恢复初始位置
self.iconButton.frame = CGRectMake(112, 125, 150, 150);

button.alpha = 0.0;
} completion:^(BOOL finished) {

//动画完成之后,删除cover
[button removeFromSuperview];
}];

 

#pragma mark -- 查找子类方法
/*

+ (NSArray *)findAllSubClassofClass:(Class)superClass
OC 运行时方法
int count = objc_getClassList(NULL, 0);

NSMutableArray *output = [NSMutableArray array];

if (count <= 0)
{//发生错误或者没有子类
@throw @"Couldn‘t retrieve Obj-C class-list";
return output;
}

Class *classes = (__unsafe_unretained Class *)malloc(sizeof(Class) * count);

count = objc_getClassList(classes, count);
for (int i = 0; i < count; ++i)
{
if (superClass == class_getSuperclass(classes[i]))//子类
{
[output addObject:classes[i]];
}
}
//释放C 语言的对象
free(classes);

return output;


*/

 

#pragma mark - 自己封装刷新控件
/*
KVO 监听父视图的contentOffset
scrollView.addObserver(self, forKeyPath: "contentOffset", options: [], context: nil)

// 本视图从父视图上移除
// 提示:所有的下拉刷新框架都是监听父视图的 contentOffset
// 所有的框架的 KVO 监听实现思路都是这个!
override func removeFromSuperview() {
// superView 还存在
superview?.removeObserver(self, forKeyPath: "contentOffset")

super.removeFromSuperview() //在这句话之前移除监听

// superView 不存在
}

// 观察者模式,在不需要的时候,都需要释放
// - 通知中心:如果不释放,什么也不会发生,但是会有内存泄漏,会有多次注册的可能!
// - KVO:如果不释放,会崩溃!

*/

有任何关于iOS开发的问题!欢迎下方留言!!!或者邮件lieryangios@126.com 虽然我不一定能够解答出来,但是我会请教iOS开发高手!!!解答您的问题!!!

Object-C知识点 (三) 单例