大脑如同编程,bug如何修复?

文/春阳

1.去除NSString字符串里面的特殊符号
-(NSString*)deleteSpecificSymbolForString:(NSString*)text{ //先创建NSCharacterSet,把需要去除的字符串放在里面 NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"@/::;;¥「」"、[]{}#%-*+=_\|~<>$€^•'@#$%^&*_+'""]; //该方法返回的就是去除特殊符号后的字符串 NSString *trimmedString = [text stringByTrimmingCharactersInSet:set]; return trimmedString;}

除了Internet Explorer,还有哪里藏满了bug?

2.判断NSString字符串里面有没有汉字
-estimateStringContainChinese:(NSString*)text{ if{ for (int i=0; i<text.length; i++) { NSRange range = NSMakeRange; NSString *subString = [text substringWithRange:range]; const char *cString = [subString UTF8String]; if (strlen == 3){ //代表有汉字 return YES; } } } return NO;}

Your Brain.你的大脑。

3.判断NSString字符串里面有没有英文字母
-estimateStringContainEnglish:(NSString*)text{ if{ for (int i=0; i<text.length; i++) { NSRange range = NSMakeRange; NSString *subString = [text substringWithRange:range]; const char *cString = [subString UTF8String]; if (strlen == 1){ //代表有英文 return YES; } } } return NO;}

在加里·马库斯的《Kluge》一书中,他这样写道:“...we humans are the only species smart enough to systematically plan for the future--yet dumb enough to ditch our most carefully made plans in favor of short-term gratification.”大概意思是,我们往往会因为短期事件打乱我们精心制定的长期计划。举个例子?比如多数人天天喊着要减肥,但有多少人会因为突然出现的美食而临时忘记自己的长远的、宏伟的计划?100个人里会有101个人会这样,多出的一个人是她身旁旁观的闺密...但这还没完,她们同时还会美其名曰:吃饱了才有力气减肥嘛。(这么做虽然是正确的,但逻辑是错误的,我将在下文中解释这个行为的心理学依据)

4.在指定控制器里面更改状态栏文字颜色
 每一个应用程序,应该都会有统一的导航栏和状态栏风格。但是有时候,也有需要在指定控制器里面修改状态栏的风格,如:播放视频。-viewWillAppear:animated{ [super viewWillAppear:animated]; [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:YES];}-viewWillDisappear:animated{ [super viewWillDisappear:animated]; [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];}

那么,自以为非常聪明的人类为什么会做出这么“愚蠢”的事情来呢?

5.点击进入搜索控制器时,自动弹出键盘,让搜索框进入编辑状态

当点击搜索时,进入搜索控制器,使用系统自带的搜索框,searchController.searchBar,进入时,自动实现如下图的效果

图片 1效果图.png

找了很多方法,下面这个是有效方法:

- viewDidAppear:animated { [super viewDidAppear:animated]; [self performSelector:@selector(showKeyboard) withObject:nil afterDelay:0];}- showKeyboard { [self.searchController.searchBar becomeFirstResponder];}

其实,这并不愚蠢。且让我慢慢道来。

6.修改系统自带搜索框的UI
 系统自带的搜索框,使用方便快捷,但是有时候它的外观与要求不符,这时候就需要我们来对系统搜索框进行一些修改for (UIView* subview in [[self.searchController.searchBar.subviews lastObject] subviews]) { //相当于UITextField,输入框,可以修改背景颜色等 if ([subview isKindOfClass:NSClassFromString(@"UISearchBarTextField")]) { UITextField *textField = (UITextField*)subview; [textField setBackgroundColor:COLOR_RGB(238, 238, 238)]; } //相当于UIButton,搜索框右侧的Cancle按钮,可以修改默认文字等 if ([subview isKindOfClass:NSClassFromString(@"UINavigationButton")]) { UIButton* cancle = (UIButton*)subview; [cancle setTitle:@"取消" forState:UIControlStateNormal]; [cancle setTitleColor:COLOR_RGB(82, 184, 255) forState:UIControlStateNormal]; } //相当于UIView,搜索框的背景view,一般将它去掉,然后自己添加一层背景view if ([subview isKindOfClass:NSClassFromString(@"UISearchBarBackground")]) { [subview removeFromSuperview]; UIView* back = [[UIView alloc]initWithFrame:self.searchController.searchBar.bounds]; back .backgroundColor = [UIColor whiteColor]; [self.searchController.searchBar insertSubview:back atIndex:0]; } }

如果我们把我们大脑所有的行为都看成是计算机领域中的“编程”行为的话,那么上面的现象其实就是一个bug,但唯一有所不同的是,这个bug未必只会产生副作用而影响人体系统的运行,反而它在平衡着这个整体。

7.在指定控制器中隐藏导航栏
 有时候,需要在指定控制器中隐藏导航栏,试过好几个方法,或多或少有些坑,下面这个是我认为比较好的: 首先让该控制器成为导航栏的代理: self.navigationController.delegate = self; 然后,实现指定的代理方法: -navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:animated{ if ([viewController isKindOfClass:[self class]]) { [self.navigationController setNavigationBarHidden:YES animated:YES]; } //返回时,在指定控制器重新让导航栏显示 if ([viewController isKindOfClass:[ContactVC class]]) { [self.navigationController setNavigationBarHidden:NO animated:YES]; }}

和程序的交互一样,大脑的首要的一个运行特点就是事件驱动(event-driven)机制,也就是说,如果没有事件发生,它几乎不会去做任何事情,而有了事件发生后,大脑就会回应(Respond)它。

8.根据指定文本,字体,固定宽度或高度,求尺寸
// 根据指定文本,字体和最大高度计算尺寸- sizeWithText:(NSString *)text font:font maxHeight:height{ NSMutableDictionary *attrDict = [NSMutableDictionary dictionary]; attrDict[NSFontAttributeName] = font; CGSize size = [text boundingRectWithSize:CGSizeMake(MAXFLOAT, height) options:NSStringDrawingUsesLineFragmentOrigin attributes:attrDict context:nil].size; return size;}// 根据指定文本,字体和最大宽度计算尺寸- sizeWithText:(NSString *)text font:font maxWidth:width{ NSMutableDictionary *attrDict = [NSMutableDictionary dictionary]; attrDict[NSFontAttributeName] = font; CGSize size = [text boundingRectWithSize:CGSizeMake(width, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:attrDict context:nil].size; return size;}

但不幸的是,我们要面临的事件简直太多了,而大脑的处理能力是有限的,我们如何应对这些事件的冲击,做出最理性的选择?

9.给UILabel设置行间距,字间距等富文本属性,并计算高度
//给UILabel设置行间距和字间距-setLabelSpace:label withValue:(NSString*)str withFont:font { NSMutableParagraphStyle *paraStyle = [[NSMutableParagraphStyle alloc] init]; paraStyle.lineBreakMode = NSLineBreakByCharWrapping; //结尾部分的文字省略方式 paraStyle.alignment = NSTextAlignmentLeft; //文本对齐方式 paraStyle.lineSpacing = 7; //设置行间距 paraStyle.hyphenationFactor = 1.0; //连字属性 在iOS,唯一支持的值分别为0和1 paraStyle.firstLineHeadIndent = 0.0; //首行缩进 paraStyle.paragraphSpacingBefore = 0.0; //段首行空白空间 paraStyle.headIndent = 0; //整体缩进 paraStyle.paragraphSpacing = 15; //段与段之间的间距 //设置字间距 NSKernAttributeName:@1.5f NSDictionary *dic = @{NSFontAttributeName:font, NSParagraphStyleAttributeName:paraStyle, NSKernAttributeName:@1.5f}; NSAttributedString *attributeStr = [[NSAttributedString alloc] initWithString:str attributes:dic]; label.attributedText = attributeStr;}//计算UILabel的高度-getSpaceLabelHeight:(NSString*)str withFont:font withWidth:width { NSMutableParagraphStyle *paraStyle = [[NSMutableParagraphStyle alloc] init]; paraStyle.lineBreakMode = NSLineBreakByCharWrapping; paraStyle.alignment = NSTextAlignmentLeft; paraStyle.lineSpacing = 7; paraStyle.hyphenationFactor = 1.0; paraStyle.firstLineHeadIndent = 0.0; paraStyle.paragraphSpacingBefore = 0.0; paraStyle.headIndent = 0; paraStyle.paragraphSpacing = 15; NSDictionary *dic = @{NSFontAttributeName:font, NSParagraphStyleAttributeName:paraStyle, NSKernAttributeName:@1.5f}; CGSize size = [str boundingRectWithSize:CGSizeMake(width, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil].size; return size.height;}

这看起来很难。大多数情况下,我们都被像被橡皮筋耍的团团转的小猫一样,不知所措,任其摆布。所以,这时候,黑客就必须站出来了。来,我们来hack一下这个优先级排序系统。

看见没,我们的优先级排序系统率先沦陷。坐着刷朋友圈永远比站起来出去锻炼更加容易。

但是不对啊,我们人类是能控制自己的高级动物啊!你看我们可以计算复杂的数学题,我们会玩Dota操作要求这么高的游戏,我们为什么连优先级都排不好呢?

那其实也是事件驱动的一部分。因为我们的大脑的计算能力有限,而做出锻炼身体和看书背单词需要足够多的意志能量驱动才可以,所以,从资源效率利用的角度来讲,我们的大脑几乎总会倾向于选择消耗能量较少的事件,也就是上面提到的刷微信朋友圈的事件。但大脑是不是就这一根筋呢?只认节省能源,不能火力全开?不是。我们大脑中还有一个单元没有被激活,即CPU,这里的CPU不是中央处理器,而是Consciousness Processing Unit,意识处理单元。你之所以会控制不住去刷朋友圈,是因为你的意识处理单元一直处于待机模式。如果你能意识到,继续刷下去而不背单词的话,你很可会无法通过几个月后的6级考试,而无法通过的话你老爸就会打断你的腿,你说你行不行动呢?意识越强烈,你的行动力就越充足。“老爸会打断你的腿”会产生极强烈的意识。而我们反过来想,几乎所有自主锻炼身体的行为都是因为我们意识到了“现在锻炼身体带来的长期收益(如4块腹肌可以在女朋友面前扬眉吐气)远远凌驾于它带来的短期痛苦”这一点。

所以如果你想走出理智的决定,你就必须时刻保持清醒的意识,也就是充足的能量。因此,上文说到的“吃饱了才有力气减肥”完全没错,饱腹的状态会给你带来充盈的能量,但未必会给你带来清醒的意识。所以我们还需要学会放松(Relax)。这一点在计算机领域表现为“休眠”,确切的说,是“散热”。电脑的处理器需要专门的电扇来驱散热量,否则时间长了就会歇菜。人脑也是一样,如果你持续做一件事情,时间长了你的心理会厌倦,你的生理会缺氧。

那么,如何干掉这个bug?

为此,我们决定引入一个新的事件。非程序员可能会把它叫作“习惯”(Habit)

而我们的新事件将会利用转变(Transition)的现象。比如说,你醒了,这就是一个转变。你到家了,这也是一个转变。转变无处不在。

而就在转变的时候,我们的大脑最容易被各种bug劫持。比如你刚回家,你很有可能会觉得妈的今天累成狗,哥要去沙发上躺会;一到周末,你就想了,是时候去找闺密胡吃海喝外加各种买买买了...怎么办呢?坐视不管吗?

来,教你今天的第一行代码:

看不懂?别怕,有我在。我们一步一步来。

先看“No”

本文由大发快三开奖结果发布于电脑,转载请注明出处:大脑如同编程,bug如何修复?

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。