重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
1、统一收键盘的方法
华坪网站制作公司哪家好,找创新互联!从网页设计、网站建设、微信开发、APP开发、响应式网站等网站项目制作,到程序开发,运营维护。创新互联自2013年起到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联。
[[[UIApplication sharedApplication] keyWindow] endEditing:YES];
2、提示框
BBAlertView *alert = [[BBAlertView alloc] initWithStyle:BBAlertViewStyleDefault
Title:@"删除订单"
message:@"是否删除订单,"
customView:nil
delegate:self
cancelButtonTitle:L(@"取消")
otherButtonTitles:L(@"确认")];
[alert setCancelBlock:^{
}];
[alert setConfirmBlock:^{
[self orderDidRemovePressDown:tempDic Index:index.section];
}];
[alert show];
3、图片的自适应功能
self.brandImage.contentMode = UIViewContentModeScaleAspectFit;
4、cocoaPods清除缓存问题
$ sudo rm -fr ~/.cocoapods/repos/master
$ pod setup
5、设置显示键盘的样式
textView.keyboardType =UIKeyboardTypeDefault;
//设置键盘右下角为完成(中文输入法下)
textView.returnKeyType=UIReturnKeyDone;
6、输出当前时间
NSDateFormatter * dateFormatter=[[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSS"];
NSLog(@"当前毫秒时间1==%@",[dateFormatter stringFromDate:[NSDate date]]);
7、显示两秒然后消失
UILabel * lab=[[UILabel alloc]initWithFrame:CGRectMake(60,Main_Screen_Height-64-49-60, Main_Screen_Width-120, 50)];
lab.backgroundColor=[UIColor grayColor];
ViewRadius(lab, 20);
lab.textAlignment=NSTextAlignmentCenter;
lab.text=@"请先进行实名制验证";
[self.view addSubview:lab];
[UILabel animateWithDuration:2 animations:^{
lab.alpha=0;
}completion:^(BOOL finished) {
[lab removeFromSuperview];
}];
8、设置placeholder属性的大小和颜色
[_phoneFie setValue:[UIColor grayColor] forKeyPath:@"_placeholderLabel.textColor"];
[_phoneFie setValue:[UIFont boldSystemFontOfSize:15] forKeyPath:@"_placeholderLabel.font"];
_phoneFie.returnKeyType=UIReturnKeyDone;
9、设置cell的交互完全不可以使用
//[cellTwo setUserInteractionEnabled:NO];
//设置cell不可以点击,但是上面的子控件可以交互
cellTwo.selectionStyle=UITableViewCellSelectionStyleNone;
10、将textField的placeholder 属性的字体向右边移动5
_field.leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10*Width_375, _field.frame.size.height)];
_field.leftViewMode = UITextFieldViewModeAlways;
11、开新线程使按钮上的时间变化
-(void)startTime{
__block int timeout=60; //倒计时时间
UIButton * btn=(UIButton *)[self.view viewWithTag:1000];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
dispatch_source_set_timer(_timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒执行
dispatch_source_set_event_handler(_timer, ^{
if(timeout=0){
dispatch_source_cancel(_timer);
dispatch_async(dispatch_get_main_queue(), ^{
[btn setTitle:@"发送验证码" forState:UIControlStateNormal];
btn.enabled = YES;
});
}else{
// int minutes = timeout / 60;
int miao = timeout % 60;
if (miao==0) {
miao = 60;
}
NSString *strTime = [NSString stringWithFormat:@"%.2d", miao];
dispatch_async(dispatch_get_main_queue(), ^{
[btn setTitle:[NSString stringWithFormat:@"剩余%@秒",strTime] forState:UIControlStateNormal];
btn.enabled = NO;
});
timeout--;
}
});
dispatch_resume(_timer);
}
12、隐藏TableView 中多余的行
UIView * view=[[UIView alloc]initWithFrame:CGRectZero];
[_tabelView setTableFooterView:view];
13、UIView添加背景图片
UIImage * image=[UIImage imageNamed:@"friend750"];
headSeV.layer.contents=(id)image.CGImage;
14、UITableView取消选中状态
[tableView deselectRowAtIndexPath:indexPath animated:YES];// 取消选中
15、带属性的字符串
NSFontAttributeName 字体
NSParagraphStyleAttributeName 段落格式
NSForegroundColorAttributeName 字体颜色
NSBackgroundColorAttributeName 背景颜色
NSStrikethroughStyleAttributeName 删除线格式
NSUnderlineStyleAttributeName 下划线格式
NSStrokeColorAttributeName 删除线颜色
NSStrokeWidthAttributeName 删除线宽度
NSShadowAttributeName 阴影
1. 使用实例
UILabel *testLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 100, 320, 30)];
testLabel.backgroundColor = [UIColor lightGrayColor];
testLabel.textAlignment = NSTextAlignmentCenter;
NSMutableAttributedString *AttributedStr = [[NSMutableAttributedString alloc]initWithString:@"今天天气不错呀"];
[AttributedStr addAttribute:NSFontAttributeName
value:[UIFont systemFontOfSize:16.0]
range:NSMakeRange(2, 2)];
[AttributedStr addAttribute:NSForegroundColorAttributeName
value:[UIColor redColor]
range:NSMakeRange(2, 2)];
testLabel.attributedText = AttributedStr;
[self.view addSubview:testLabel];
16、加大按钮的点击范围
把UIButton的frame 设置的大一些,然后给UIButton设置一个小些的图片
[tmpBtn setImageEdgeInsets:UIEdgeInsetsMake(5, 5, 5, 5)];
// 注意这里不能用setBackgroundImage
[tmpBtn setImage:[UIImage imageNamed:@"testBtnImage"] forState:UIControlStateNormal];
17、//避免self的强引用
__weak ViewController *weakSelf = self;
18、//类别的创建
command +n ——Objective-C File———(File Type 选择是类别还是扩展)———(Class 选择为哪个控件写类别)
19、修改UITableview 滚动条颜色的方法
self.tableView.indicatorStyle=UIScrollViewIndicatorStyleWhite;
20、利用UIWebView显示pdf文件
webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
[webView setDelegate:self];
[webView setScalesPageToFit:YES];
[webViewsetAutoresizingMask:UIViewAutoresizingFlexibleWidth |UIViewAutoresizingFlexibleHeight];
[webView setAllowsInlineMediaPlayback:YES];
[self.view addSubview:webView];
NSString *pdfPath = [[NSBundle mainBundle]pathForResource:@"ojc" ofType:@"pdf"];
NSURL *url = [NSURLfileURLWithPath:pdfPath];
NSURLRequest *request = [NSURLRequestrequestWithURL:url
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:5];
[webView loadRequest:request];
21、将plist文件中的数据赋给数组
NSString *thePath = [[NSBundle mainBundle]pathForResource:@"States" ofType:@"plist"];
NSArray *array = [NSArrayarrayWithContentsOfFile:thePath];
22、隐藏状态栏
[[UIApplication shareApplication]setStatusBarHidden: YES animated:NO];
23、给navigation Bar 设置title颜色
UIColor *whiteColor = [UIColor whiteColor];
NSDictionary *dic = [NSDictionary dictionaryWithObject:whiteColor forKey:NSForegroundColorAttributeName];
[self.navigationController.navigationBar setTitleTextAttributes:dic];
24、使用AirDrop 进行分享
NSArray *array = @[@"test1", @"test2"];
UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:array applicationActivities:nil];
[self presentViewController:activityVC animated:YES
completion:^{
NSLog(@"Air");
}];
25、把tableview里面Cell的小对勾的颜色改成别的颜色
_mTableView.tintColor = [UIColor redColor];
26、UITableView去掉分割线
_tableView.separatorStyle = NO;
27、正则判断手机号码地址格式
- (BOOL)isMobileNumber:(NSString *)mobileNum {
// 电信号段:133/153/180/181/189/177
// 联通号段:130/131/132/155/156/185/186/145/176
// 移动号段:134/135/136/137/138/139/150/151/152/157/158/159/182/183/184/187/188/147/178
// 虚拟运营商:170
NSString *MOBILE = @"^1(3[0-9]|4[57]|5[0-35-9]|8[0-9]|7[06-8])\\d{8}$";
NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];
return [regextestmobile evaluateWithObject:mobileNum];
}
28、控制交易密码位数
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
if (textField.text.length =6){
[MBProgressHUD showMessage:@"密码为6位" afterDelay:1.8];
return NO;
}
return YES;
}
29、判断是不是空
if ([real_name isKindOfClass:[NSNull class]] ) {
return NO;}
30、点击号码拨打电话
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://400966220"]];
31、控制UITabbar的选择哪一个
[self.tabBarController setSelectedIndex:1];
32、获取当前App的版本号
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
CFShow(infoDictionary);
// app名称
NSString *app_Name = [infoDictionary objectForKey:@"CFBundleDisplayName"];
// app版本
NSString *app_Version = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
// app build版本
NSString *app_build = [infoDictionary objectForKey:@"CFBundleVersion"];
33、苹果app权限NSPhotoLibraryUsageDescriptionApp需要您的同意,才能访问相册NSCameraUsageDescriptionApp需要您的同意,才能访问相机NSMicrophoneUsageDescriptionApp需要您的同意,才能访问麦克风NSLocationUsageDescriptionApp需要您的同意,才能访问位置NSLocationWhenInUseUsageDescriptionApp需要您的同意,才能在使用期间访问位置NSLocationAlwaysUsageDescriptionApp需要您的同意,才能始终访问位置NSCalendarsUsageDescriptionApp需要您的同意,才能访问日历NSRemindersUsageDescriptionApp需要您的同意,才能访问提醒事项NSMotionUsageDescriptionApp需要您的同意,才能访问运动与健身NSHealthUpdateUsageDescriptionApp需要您的同意,才能访问健康更新NSHealthShareUsageDescriptionApp需要您的同意,才能访问健康分享NSBluetoothPeripheralUsageDescriptionApp需要您的同意,才能访问蓝牙NSAppleMusicUsageDescriptionApp需要您的同意,才能访问媒体资料库
34、控件设置边框
_describText.layer.borderColor = [[UIColor colorWithRed:215.0 / 255.0 green:215.0 / 255.0 blue:215.0 / 255.0 alpha:1] CGColor];
_describText.layer.borderWidth = 1.0;
_describText.layer.cornerRadius = 4.0;
_describText.clipsToBounds = YES;
35、//隐藏电池条的方法
-(BOOL)prefersStatusBarHidden{
return YES;
}
36、延时操作
[NSThread sleepForTimeInterval:2];
方法二:
[self performSelector:@selector(delayMethod) withObject:nil afterDelay:1.5];
37、系统风火轮:
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO; //隐藏
38、//didSelectRowAtIndexPath:方法里面找到当前的Cell
AssessMentCell * cell = [tableView cellForRowAtIndexPath:indexPath];
39、navigation上返回按钮的颜色以及返回按钮后面文字去掉
//返回按钮后边文字去掉
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60)
forBarMetrics:UIBarMetricsDefault];
//设置左上角返回按钮的颜色
self.navigationController.navigationBar.tintColor = UIColorFromRGB(0x666666);
40、lineBreakMode //设置文字过长时的显示格式
label.lineBreakMode = NSLineBreakByCharWrapping;以字符为显示单位显
示,后面部分省略不显示。
label.lineBreakMode = NSLineBreakByClipping;剪切与文本宽度相同的内
容长度,后半部分被删除。
label.lineBreakMode = NSLineBreakByTruncatingHead;前面部分文字
以……方式省略,显示尾部文字内容。
label.lineBreakMode = NSLineBreakByTruncatingMiddle;中间的内容
以……方式省略,显示头尾的文字内容。
label.lineBreakMode = NSLineBreakByTruncatingTail;结尾部分的内容
以……方式省略,显示头的文字内容。
label.lineBreakMode = NSLineBreakByWordWrapping;以单词为显示单位显
示,后面部分省略不显示。
iOS开发的前景是非常好的。
ios开发行业近年发展较好,以目前iOS开发就业行情来说,iOS开发行业在就业率和就业薪资上是超越其他行业的,浏览相关招聘平台便知。企业对于iOS开发人才也是非常需要的,相应的给出的薪资待遇都是比较高的,万元左右,根据个人学习发展可能会更高,因此在未来的5到10年间iOS开发的前景依然比较乐观。
iOS开发学者只要学好这门技术了,技能与实战的同步进行使其拥有一定的项目开发经验,在求职过程中具备更大的竞争优势,在前景比较好的行业中找工作,高薪自然会很容易。
iOS:基于Unix闭源的操作系统,核心语言是Objective-C,相关的语言还有C语言(重点在数据结构和算法),Swift(iOS开发的发展趋势)
Android基于Linux的开源的操作系统,开发语言是Java(通用性强)。
两种语言各自的特点:
Android系统特点。Android系统由于是开放源代码,所以支持它的手机很多,可以免费使用的软件也很多,可以不断升级。
iOS系统特点。他的主要特点是使用方便,灵活,但是由于其封闭的系统,什么软件要么买,要么越狱比较麻烦。
执行效率的比较:
Android的编程语言是Java,特点是通用性强,但是效率低。
iOS的编程语言是Objective-C,专一性强,效率高。
百度移动统计是一款免费移动应用统计分析工具,支持iOS和Android两大平台,开发者通过嵌入统计SDK,即可实现对移动应用的全面监测,实时掌握产品表现,洞察用户行为。
百度移动统计使用方法
百度移动统计只需要几步设置即可查看报表:
1. 登录官网
2. 注册一个账号(一个账号下可以同时管理多个应用,支持百度账号和联盟账号两种登录方式)
3. 登录后在全部应用页面点击新增应用,填写应用的基本信息,获取应用的唯一识别码(即AppKey)
4. 下载对应平台的SDK(软件安装包,只有42K大小,业界最轻便),并参考SDK包中的开发文档集成SDK。无需代码层级的设置,可实时查看到除渠道分布、自定义事件之外的全部移动数据统计报表。
5. “渠道分布”和“自定义事件”的统计分析,需要开发者额外在SDK中的SetChannel和Void onEvent(详细使用方法见SDK包中的“开发文档”)函数中设置和调用相应的接口。
百度移动统计使用经验
1. 高级筛选功能
百度移动统计的“高级筛选”功能能够帮助开发者对报表按照时间维度、渠道维度、用户类型和版本维度等四个维度进行交叉筛选。
1) 时间维度筛选
点击“高级筛选”模块右上方的时间控件,可以将数据报表按照时间段来筛选,包括“今日、昨日、最近7天、最近30天”,亦可以通过日历控件选择任何一个时间点或时间段。而且,通过时间控件的“对比”功能,让开发者能够自定义对比任何两个时间点或时间段的报表数据。
百度移动统计还特别设计了“按小时”为粒度的时间筛选功能,让开发者掌握数据的实时动态变化情况。
2) 渠道维度筛选
通过渠道筛选功能快速查看某一单一渠道的数据报表,考量某渠道的推广效果和数据变化。
由于渠道商有时候会非常的多,甚至能达到几百个渠道,因此百度移动统计的高级筛选功能还特别提供了“渠道商搜索框”的功能,只要在图中红色圈出来的框内输入渠道商的名称或简写,就可以快速查看该渠道的数据报表。
3) 用户类型筛选
用户类型需要开发者在管理端进行提前设置,例如将注册用户和非注册用户设置成为两个用户类型,这样就可以在“高级筛选”例表中对用户类型进行筛选。
4) 版本维度筛选
移动应用不同于传统Website网站,不能实现在线主动升级,必须要让客户下载升级包才能够实现更新,因此移动应用就存在多个版本都会有用户在使用,有的超级应用甚至有十几个版本在同时被用户使用着。通过“高级筛选”中的版本筛选维度就能够快速选定某一版本,进行定向的数据报表分析。并且,如渠道筛选维度一样,百度移动统计提供了“版本搜索”功能。
2. 为什么应用的历史数据会有增加的现象?
百度移动统计系统的使用者很多需要向上级做应用数据的日报或周报,有不少用户会困惑一点,就是为什么像新用户、启动次数、留存用户等历史数据会在之后有增加的现象?
原因是,百度移动统计为了体现数据的时效性,采用了“数据补偿”的机制。例如,某用户在9月1日启动了应用,但是由于网络故障等原因导致日志信息未能及时发出去,直到9月5日再次启动联网之后才发送出来。这样一来,服务器是在9月5日接收到的日志,但用户的数据属于9月1日的,所以百度移动统计系统会自动将数据“补偿”到9月1日的数据报表中,也就会出现所谓的“历史数据增加”的现象了。一般来讲,这个数据补偿会在两周左右趋于相对稳定,具体时间根据应用情况而不同。
3. “渠道分布”和“渠道来源细分”有什么区别?
百度移动统计的功能导航栏里面,有“渠道分布”和“渠道来源细分”两个功能。乍一看,从字面上来讲确实会产生疑惑——“这两个功能有什么区别吗?”
其实这两个功能区别还是蛮大的,下面从两个方面进行详细的对比和区分:
1) 功能层面:
渠道分布:可以统计到来自不同渠道商的流量导入情况
渠道来源细分:对于Android应用,能细分统计到不同推广位置的导入效果;对于iOS应用,能细分统计到App Store上游渠道来源的导入效果
2) 结算依据:
渠道分布:对不同渠道导流数据统计准确率超过95%,可以作为与渠道商结算依据
渠道来源细分:由于URL封装后,从点击到激活不可避免的会产生数据丢失,存在一定误差,因此来源细分功能主要帮助开发者衡量各渠道之间的推广效果,不建议作为与渠道商结算的依据。
4. 怎样利用多维度指标综合分析“用户粘性”?
移动开发者之所以关注用户行为分析的本质目的,就是为了提高用户的使用粘性。所以用户粘性分析是一个综合维度的分析,很多指标都可以从侧面反映出应用的用户粘性程度,其中最直接衡量用户粘性的指标就是使用时长和使用频率了。通常情况下,用户使用时长越长、使用频率越高说明用户粘性越大。
使用频率是指用户在一天中启动应用程序的次数,例如用户某一天只在早晨8点和中午12点分别启动过应用,那么该用户当天的使用频率就是2次。
使用时长是指用户在某次启动应用到退出应用的时间间隔,例如用户于10点启动应用,于10点半退出应用,那么该用户的使用时长即为30分钟。
如前文所述,用户粘性是受到使用频率和使用时长共同影响的,如下图建立二维象限,即可将使用时长和频率进行综合分析,四个象限也分别代表高频率高时长、高频率低时长、低频率高时长和低频率低时长特点的应用。
接下来,笔者针对上图中四个象限的应用特点进行逐一分析:
高频率高时长:用户粘性高,这类应用通常满足了用户的刚性需求,用户依赖度非常高,日启动次数多,使用时间较长,应用提供的核心功能用户体验极好。例如微信、微博等社交类应用。
高频率低时长:用户粘性较高,这类应用用户依赖度很高,但是由于功能性有限或以满足用户某种专门需求为主,所以导致用户每次启动之后停留时间不长。例如工具类应用,如杀进程、闹铃、提醒、流量监测、清缓存等应用。
低频率高时长:用户粘性较高,这类应用用户依赖度一般,但是由于极好地满足了用户的核心需求,所以每次启动的停留时间都很长,用户愿意在应用上花更多的时间和精力。这类应用主要集中在电商应用、游戏类应用和新闻阅读类应用。
低频率低时长:用户粘性低,这类应用既没有满足用户刚性需求又没有让人眼前一亮的用户体验,所以没有得到用户的认可和依赖,在用户粘性上是失败的应用。
如果说上一个十年是WEB互联网的时代,那么接下来的十年绝对就是移动互联网的天下。对于移动开发者来讲,这是一个绝佳的机会,但同样意味着极大的挑战。百度移动统计愿与全体开发者一同,引领大数据时代下移动应用精细化、数据化运营的浪潮。
如果没装逼的话,那恭喜你,运气这么好。这个薪资非常高了不建议跳槽。现在移动开发,尤其IOS。市场根本死一大片。有三点可以得出,1、速成班越来越多,4个月输出一堆学员到市场,2、开发越来越简单,各种第三方越来越多,应有尽有。不用科班出身,只要速成四个月,只要不是弱智儿,都能做出APP。堆积木而已。3、大环境下泡沫公司死一片,市场对IOS开发的需求比前几年少了几倍。IOS工作年限跟技术水平毫无关系。只不过是堆积木的速度而已。而IOS薪资向来就是虚高的,供求关系,倒逼效应,导致虚高。泡沫而已。现在市场不断回归理性。你这个薪资,出去基本上难以找到。
基础
一定的编程经验
这里说的编程经验是至少熟练一门编程语言,对 OOP 有一定的了解,最好熟悉一些基本的设计模式。遇到过的好多 iOS 开发,大多是从别的语言转过来的,所以有一定的编程基础,学起来会更容易 get the point.
如果是第一次接触编程,当然也是没问题的,只是要做好心理准备,可能会比想象的难。
英语
发现不少开发对于英语似乎有点接受不能,通常都是中文优先,除非迫不得已,才硬着头皮看看 StackOverflow,英文文章,文档等。忘了是谁说过「难走的路越走越好走」,通常如此。其实只要稍微 push 一下自己,那些技术文章啃下来应该不会有太大的问题,有过几次成功的体验后,这种恐惧感就会减少很多。优质的文章、视频、书籍,多是英文的,不迈过这个 坎,将来要么成为瓶颈,要么花更大的成本去填补。
入门
书籍
要学习 iOS 开发,自然要先学 Objective-C (当然现在也可以直接上 Swift,不过如果多人协作的话,OC目前还是主流),因为 OC 是 C 语言的超集,所以了解 C 语言对于学习 OC 肯定会有帮助,不过就算不了解,直接学 OC 也没太大问题。
这里推荐 BNR (Big Nerd Ranch) 的这本 Objective-C Programming The Big Nerd Ranch Guide,讲解地比较细致,能帮助你更好的理解 OC,更重要的是教你遇到问题时,如何去解决问题,以及这个问题对应的一些知识点,如何使用文档等等。
来到一个新的世界,肯定会对这个世界充满好奇,想订阅一大堆博客,买一堆书,看各种教程和视频,然后就变得浮躁,不知该从哪下手,这会导致拖延症。 我渴了,给我倒一杯水,这个很直接,马上就可以做,但如果是给我买一瓶饮料,而自己对那些饮料又不怎么熟悉时,就纠结了,不如刷会微博,看看朋友圈,玩个小游戏先。
所以一本好的入门教材很重要,要契合自己当前的水平,且常常会有收获,这种成就感会激励着你继续学下去。
在看书的过程中,往往会有这样的经历:书中提到某个人、观点、知识点、书、文章,然后就顺着它提到的这些东西出去了,可能某个知识点又牵扯到另一些内容,然后就这样越走越远。想起了一个故事——
三只猎狗追一只土拔鼠,土拔鼠逃跑时钻进了一个树洞。这个树洞只有一个出口,不一会儿,忽然从树洞里跑出一只兔子。兔子飞快地向前跑,并爬上另一棵大树。兔子因为慌乱在树上没站稳,掉了下来,砸晕了正仰头看的三只猎狗,最后,兔子终于逃脱。
对于这个故事可以从不同的角度去解读,我更愿意以初心去解读。兔子为什么会爬树?为什么能砸晕三只猎狗?这不是重点,重点是,之前追赶的土拨鼠哪去了?看书时难免会有延伸阅读,这个深度我觉得不宜超过 2 层,不然很容易就回不来了。
还有就是如果有可能,最好每天都看点,这其实是很难的,因为总是会有优先级更高的事,或者之前的某些习惯在干扰。一旦断了几天,就不想再拿起来了。
还有,苹果官方的 Start Developing iOS Apps Today 也是很不错的入门材料。
视频
推荐斯坦福老头子(Paul Hegarty)的 Developing iOS 7 Apps for iPhone and iPad ,当初也是看的这个(那时还是更老的版本),Paul 是资深的 Mac/iOS 开发(前苹果员工?),很多知识点讲得很到位,学生们的提问也大都在点上,同时配有Demo,总之听下来会对 iOS 开发有比较全面的了解。
同时推荐一本小册子:objc-zen-book,花不长时间就能看完,里面是一些 Best Practices,对于编写优质代码会很有帮助。
笔记
这是一个持久的过程,任何阶段都适用。以前也没太在意这个,觉得概念性的东西,脑子过一遍,就大概知道了,然后就去啃其他的东西了,现在看来,如果有记笔记的话,会更有助于消化概念、知识点,也可以记录自己的思考过程。达芬奇就记录了10000多页的笔记。
记笔记可以加深对知识点的理解,而成为编程巨星的唯一秘诀就是:对所做的事情理解地越深,就会做得越好。同时如果遵循遗忘曲线去复习的话,效果更佳。对知识点了解地足够透彻后,Debug 时才更有可能知道问题出在哪,解决问题也更容易有思路。
笔记不仅可以记知识点,也可以记录调试过程,比如这篇笔记,有一种调试方法:小黄鸭调试法
许多程序员都有过向别人(甚至可能向完全不会编程的人)提问及解释编程问题,就在解释的过程中击中了问题的解决方案。一边阐述代码的意图一边观察它实际上的意图并做调试,这两者之间的任何不协调会变得很明显,并且更容易发现自己的错误。
生活中我们可能不会真的这么去做,这时抽离出另一个自己,记录下跟ta的对话,也是个发现问题的好方法。
练习
这也是一个持续的过程,知道了些概念或原理后,总是会想着去验证下是不是这样,无论结果是否如自己预期,实践的过程会降低对语言的陌生感,慢慢地培养一种驾驭这门语言的自信,如果出了错,正好可以重新梳理一下。
目标
如果静下心来看完了 BNR 的这本书,以及斯坦福的 iOS 开发视频,那么对 OC 应该比较了解了,一些常用的 UIKit 用起来也没什么问题了,比如 UIViewController / UIView / UIScrollView / UIImageView / UITableView。也熟悉一些概念,如 KVO / MVC / Delegate / DataSource。
这个阶段下来,应该会有:哦,iOS 开发也就这样嘛,多翻翻文档,熟悉 Cocoa Touch 的一些 Class,差不多也能做出一个简单的 App 了。
进阶
入门之后,接下来可以折腾的东西还会有不少。
书籍
Effective Objective-C 2.0,里面提到了 52 种提高 iOS App 质量的途径。涉及了 API 设计、protocols / category 的使用、写出更模块化的代码等,读下来应该会有不少收获。
iOS Programming: The Big Nerd Ranch Guide (4th Edition),又是一本 BNR 的书,这本书的特点是通过 Demo 来引出知识点,然后提一些问题,并且会细说解题思路。看书的过程中,对于元学习能力的提升也会有一定帮助。
--- update ---
发现巧哥的 iOS开发进阶 已经可以在京东买到了,虽然没有细看,但巧哥出品质量肯定有保障。
其他资源
进入这个阶段后,可以去探索更大的世界了,现在的资源已经很丰富了,但还是要遵循「少而精」的原则。以下是我觉得挺不错的资源
iOS Dev Weekly 每周一期,内容多为这一星期里值得关注的Github项目、文章、工具等。
iOS 移动开发周报 这是唐巧大大整理的每周不错的 iOS 开发相关的内容,多为中文。
RayWenderlich 很多详细又全面的教程,不容错过。
iOS Dev Slack 国内不少 iOS 开发(包括大大们)都在这里,不过现在好像不怎么能拿到邀请了。
中文 iOS/Mac 开发博客列表,打开工具订阅吧。
还有,如果可能的话,多去分享自己学到的东西,教是最好的学,我试过几次,效果真的很不错。
目标
这个阶段下来,对于常用的设计模式、内存管理、Blocks 的使用、图像操作、网络请求和管理、多线程应该比较熟悉了。对于 CALayer、Animation、UIScrollView、UITableView、UICollectionView、 ViewController Container 则非常熟悉,对「非常熟悉」的定义是:不打开 Xcode,脑子里就能把相应的知识点复述出来 80% ,比如这个类有哪些方法,Delegate / DataSource 有哪些方法,怎么使用,如果要实现某个效果,应该怎么做(好吧, UICollectionView 除外)。
高级
其实高级、进阶、入门并没有严格的界限,在入门阶段也可以探究高级阶段的一些东西。我觉得支撑我们不断探索和前进的动力不是兴趣,而是永不满足的好奇心,和对优雅代码的追求。
If your standards are low, you're going to stop pretty early on in the process.
BNR 的这篇 Leveling Up 已经讲得很好了,也更加细致。
书籍
iOS 7 Programming Pushing the Limits 这本书对 iOS 7 的一些特性会讲解地比较深入,当然也不仅仅是 iOS 7。只叹 iOS 更新实在太快,书籍往往跟不上,一本好书往往需要很长时间来撰写,等书可以出版了,iOS 又出新版本了。
源码
看优秀的源码,可以学到很多东西,使用过程中遇到问题也更容易解决。这些是我觉得值得细看的源码:AFNetworking(NSOperation, HTTP, Block), SDWebImage(Image Handle, Cache, NSOperation, Block),SVPullToRefresh(UIScrollView, State Handle), JSONModel(runtime)
如果有兴趣,也可以翻翻 CoreFoundation / OC runtime 的源码。
资源
oleb
NSHipster
objc.io || objcio.cn
WWDC 视频
工具
chisel Facebook 出品的 LLDB 助手,用于调试很方便
Reveal 每当好奇某个 App 的实现时,都会打开它一窥究竟,用于调试自己的 App 也很方便
Aspects steipete 大大出品的一款方便使用 method swizzling 的工具,可以在运行时动态添加代码到某个方法
class-dump 从 Mach-O 文件生成 OC 头文件,有时想看看某个 App 大概是如何组织的会比较方便
Hopper 可以对二进制文件进行反编译,甚至可以生成伪代码!有时想看看 UIViewController 里某个方法大概是怎么实现的,就可以用它。
Instruments 这个内置的工具对于发现 App 的各种问题很有帮助,如内存占用、泄露,渲染问题等。
目标
这个阶段,对于底层的实现会有更深入的了解,各种 Core 开头的 Framework 至少可以说出个大概,工具也能熟练使用,「正经的代码」写过数万行,可能天天在翻 Dash。如果别人让你实现某个功能,能在较短的时间内给出不错的实现方案,并且足够细致,甚至精细到如何使用 Core Graphic 去画某个图像。
其他
我觉得无论学习什么,「速成」的心态是最要不得的,这只会让自己变得浮躁,一知半解,整个过程也很难让自己的元学习能力得到提升。慢慢来,攻占一个城后,再去打下一个,这时心态也会平和许多。