保存工作和学习过程中使用,学习到的Demo

原文:保存工作和学习过程中使用,学习到的Demo

iOS_Demo保存工作和学习过程中使用,学习到的Demo

[1]. block_pass_value使用block作为方法的参数,实现界面反向传值。[2]. multi_image_cache_and_download使用NSBlockOperation和NSCache,实现tableViewcell里加载网络图片,并带有缓存功能(仿照SDWebImage的逻辑)。

[3]. init_and_initWithFrame对于UIView,即使是用init方法创建实例,也会先调用initWithFrame:方法,然后再调用init方法。

[4]. clean_tableview将tableview的datasource单独抽取出来作为一个类,减少viewcontroller的代码量。cell的绘制方法使用block函数调用。

[5]. associate_object在分类中使用关联对象给类添加属性。

[6]. collectionview_masonry_layout瀑布流的实现,自定义cell的垂直,水平间距,以及列数。

- (void)viewDidLoad {      

  [super viewDidLoad];      

  [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:CellIdentifier];  

  SSJMasonryLayout *layout = (SSJMasonryLayout*)self.collectionView.collectionViewLayout;    layout.delegate = self;   

 //自定义列数,cell的水平距离,cell的垂直距离   

 layout.numberOfColumns = 4;   

 layout.itemHorizontalSpacing = 10;   

 layout.itemVerticalSpacing = 20;

}

#pragma mark- SSJMasonryLayoutDeleagte

- (CGFloat) collectionView:(UICollectionView*) collectionView  layout:(SSJMasonryLayout*) layout  heightForItemAtIndexPath:(NSIndexPath*) indexPath {    

//提供cell的随机高度    

CGFloat randomHeight = 100 + (arc4random() % 140);    

return randomHeight;

}

[7]. oc_js_interactionOC与JS代码的简单交互。

 [8]. access_private_property用KVC和runtime改变私有属性。

1. 定义公有属性和私有属性:

@interface Person : NSObject@property (nonatomic, copy) NSString *name;

//公共属性

@end

@interface Person()

@property (nonatomic, copy) NSString *job;

//私有属性

@end

@implementation Person{    

NSString *_country;//私有成员变量

}

2. 使用kvc修改公共属性和私有属性以及私有成员变量

[person setValue:@"jack" forKey:@"name"];

//公共属性

[person setValue:@"coder" forKey:@"job"];

//私有属性

[person setValue:@"China" forKey:@"country"];

//私有成员变量

NSLog(@"kvc改变成员变量的值:%@",person);

//name:jack, job:coder, country:China####

3. 使用runtime修改私有属性以及私有成员变量

[self changeIvarOfObject:person withIvarName:@"_job" toValue:@"manager"];

[self changeIvarOfObject:person withIvarName:@"_country" toValue:@"America"];

NSLog(@"runtime 改变成员变量的值:%@",person);

//name:Bob, job:manager, country:America

- (void)changeIvarOfObject:(id)object withIvarName:(NSString *)name toValue:(NSString *)value{    

Ivar ivar = class_getInstanceVariable([object class], [name UTF8String]);        object_setIvar(object, ivar, value);

}

[9]. custom_segue自定义转场动画:

将push显示为model:新建一个类继承UIStoryboardSegue,然后重写perform方法。

#import "CustomSegue.h"

@implementation CustomSegue

- (void)perform{    

UIViewController *fromVC = (UIViewController *)self.sourceViewController;    UIViewController *toVC = (UIViewController*)self.destinationViewController;

        //获取第一个页面初始状态的frame    

CGRect f = fromVC.view.frame;    

CGRect originalSourceRect = fromVC.view.frame;       

 f.origin.y = f.size.height;        

 //令第二个页面在开始的时候位于屏幕底部    

 toVC.view.frame = f;    

 toVC.view.alpha = 0.0f;    

[[fromVC.view superview] addSubview:toVC.view];       

 [UIView animateWithDuration:0.3 animations:^{                

//令第二个页面的frame等于第一个页面初始状态的frame(满屏)       

 toVC.view.frame = originalSourceRect;        

toVC.view.alpha = 1.0f;           

 } completion:^(BOOL finished) {               

 [toVC.view removeFromSuperview];        

 fromVC.view.alpha = 1.0f;       

 [fromVC.navigationController pushViewController:toVC animated:NO];           

 }];}

[10]. mvvm_kvo_two_way_binding用FBKVOController实现的mvvm的双向绑定。

viewmodel监听model的变化:

//模拟网络请求   

 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{                

//新请求下来一个model        

self.model = [[SJModel alloc] init];        

self.model.number = arc4random() % 100;;                

//viewmodel监听model的改变      

  [self.KVOController observe:self.model keyPath:@"number" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial block:^(id  _Nullable observer, id  _Nonnull object, NSDictionary* _Nonnull change) {            NSLog(@"viewmodel监听到了model的改变后,立即改变自己被控制器监听的属性");            self.contentStr = [self convertNumber:self.model.number];

 }];    

});

view监听viewmodel的变化:

- (instancetype)initWithViewModel:(SJViewModel *)viewModel{    

self = [super init];        

if (self) {                

self.viewModel = viewModel;                

//view监听viewmodel的contentStr属性的改变,一旦改变,刷新自己       

 [self.KVOController observe:self.viewModel keyPath:@"contentStr" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial block:^(id  _Nullable observer, id  _Nonnull object, NSDictionary* _Nonnull change) {            

NSLog(@"当view监听到了viewmodel的改变后,立即改变自己"); 

self.label.text = self.viewModel.contentStr;        

}]; }   

 return self;}

[11]. multi_thread_communication线程通信的几个例子:NSOperation,GCD,NSObject

[12]. gcd_demo介绍了GCD的API:dispatch_barrier,dispatch_wait,dispatch_group,dispatch_apply等

[13]. autoresizing_demo由xib生成的view默认会跟随父控件大小的变化而变化。如果不让二者有依赖性,需要设置view的autoresizingMask属性。

UIView *subview = [[NSBundle mainBundle] loadNibNamed:@"subview" owner:nil options:nil].firstObject;   

 //不让xib的view随着父控件的大小而变化subview.autoresizingMask = UIViewAutoresizingNone;

[14].block_lowlevel_analysisblock的底层分析

[15].method_swizzling使用runtime交换方法(类方法,实例方法)交换类方法

+ (void)load {        

static dispatch_once_t onceToken;   

 dispatch_once(&onceToken, ^{                

SEL originalSelector = @selector(imageNamed:);        

SEL swizzledSelector = @selector(sj_imageNamed:);                

Method originalMethod = class_getClassMethod(self, originalSelector);        

Method swizzledMethod = class_getClassMethod(self, swizzledSelector);               

 //交换实现       

 method_exchangeImplementations(originalMethod, swizzledMethod);    });}

+ (UIImage *)sj_imageNamed:(NSString *)name{

    UIImage *image = [UIImage sj_imageNamed:name];

        if (image) {

        NSLog(@"图片加载成功");

    } else {

        NSLog(@"图片加载失败");

    }        

return image;}

交换实例方法:

+ (void)load { 

       static dispatch_once_t onceToken; 

       dispatch_once(&onceToken, ^{ 

               Class class = [self class];

                SEL originalSelector = @selector(viewWillAppear:);

                SEL swizzledSelector = @selector(sj_viewWillAppear:);                

Method originalMethod = class_getInstanceMethod(class, originalSelector); 

Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);                

//交换实现       

 method_exchangeImplementations(originalMethod, swizzledMethod);

    });

}

- (void)sj_viewWillAppear:(BOOL)animated {

    [self sj_viewWillAppear:animated];

    NSLog(@"viewWillAppear: %@", self);

}

[16]. kvo_array_count使用runtime交换方法来同志array count是否变化(未完成)

[17]. class_addMethod_demo给类添加方法:避免在运行时收到某个没有实现的方法。

#import "Car+Fly.h"

#import

void beginToFly(id self, SEL _cmd) {

NSLog(@"begin to fly");

}

@implementation Car (Fly)

+ (BOOL)resolveInstanceMethod:(SEL)sel {

//如果是fly方法,目前没有这个方法的实现,于是就添加一个fly方法

if (sel == @selector(fly)) {

class_addMethod([self class], sel, (IMP)beginToFly, "v@:");

return YES;

}

return [super resolveInstanceMethod:sel];

}

@end

[18]. kvc_demo

使用kvc访问共有属性,私有属性,keypath,集合操作等。

//set public ivar

[person setValue:@"Peter" forKey:@"name"];

NSLog(@"name:%@",person.name);

//set public _ivar

[person setValue:@"male" forKey:@"_sex"];

NSLog(@"sex:%@",[person valueForKey:@"_sex"]);

//set privacy ivar

[person setValue:@"centry road" forKey:@"address"];

NSLog(@"address: %@",[person valueForKey:@"address"]);

//set privacy _ivar

[person setValue:@"China" forKey:@"_country"];

NSLog(@"country: %@",[person valueForKey:@"_country"]);

//set primary type

[person setValue:[NSNumber numberWithInteger:12] forKey:@"money"];

NSLog(@"set money: %ld",person.money);

NSLog(@"query money: %@",[person valueForKey:@"money"]);

//set keypath

[person setValue:@"Apple" forKeyPath:@"company.name"];

NSLog(@"name of company: %@",[person valueForKeyPath:@"company.name"]);

//collection

person.friends = @[@"Jim",@"Brunce",@"Nancy"];

NSNumber *count = [person valueForKeyPath: @"friends.@count"];

NSLog(@"number of friend: %ld", [count integerValue]);

//start from person

NSNumber *avg = [person valueForKeyPath: @"products.@avg.price"];

NSLog(@"avg of products: %ld", [avg integerValue]);

NSNumber *max = [person valueForKeyPath: @"products.@max.price"];

NSLog(@"max of products: %ld", [max integerValue]);

NSNumber *min = [person valueForKeyPath: @"products.@min.price"];

NSLog(@"min of products: %ld", [min integerValue]);

NSNumber *sum = [person valueForKeyPath: @"products.@sum.price"];

NSLog(@"sum of products: %ld", [sum integerValue]);

[19]. bad_access_demo

访问野指针

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,678评论 0 9
  • 1.为什么说Objective-C是一门动态的语言? 一、动态语言,是指在程序运行时能够改变其结构,新的函数可以被...
    年轻就要活出样阅读 460评论 0 1
  • 【2017年最新】☞ iOS面试题及答案 设计模式是什么? 你知道哪些设计模式,并简要叙述? 设计模式是一种编码经...
    紫色冰雨阅读 596评论 0 1
  • 01专用资源和通用资源 薛兆丰老师讲了一个专用资源和通用资源的概念。 在一个企业中,人的价值分为两种:一种是专用资...
    4d67e06828ce阅读 863评论 2 1
  • 不知道何时喜欢的你 不知道何时能再相见 不知道何处能再相遇 你可知道 我无时无刻不论何处何地都在想着姓为何的你
    yogic阅读 193评论 0 0