iOS学习总结(一)
学习iOS这么长时间所遇到了很多问题,一路走来总结了一些自己遇到的问题:
1.关联
objc_setAssociatedObject关联是指把两个对象相互关联起来,使得其中的一个对象作为另外一个对象的一部分。
2.tableView的beginUpdates 和 endUpdates
3.关于代码与storyBoard的自动布局
4.国际化与本地化,为了实现全球化
5.技巧
可以通过设置Scheme来设置app所运行的语言,你想要什么语言就是什么语言,而不用重新设置系统的语言。
6.ios8新特性,加载js
如果我想要加载一个形如网页的东西,那么我需要对整个网页进行动态的编辑,图文混编,但是这样做那面会带来很困难的操作,其实服务端那边很好的可以解决这个问题,用一个网页即可以搞定。服务端那边只需返回一个html文档,然后客户端根据这个html文档进行解析即可。
一、WKWebView新特性
• 在性能、稳定性、功能方面有很大提升(最直观的体现就是加载网页是占用的内存,模拟器加载百度与开源中国网站时,WKWebView占用23M,而UIWebView占用85M);
• 允许JavaScript的Nitro库加载并使用(UIWebView中限制);
• 支持了更多的HTML5特性;
• 高达60fps的滚动刷新率以及内置手势;
• 将UIWebViewDelegate与UIWebView重构成了14类与3个协议
7.技巧
写 函数的时候一定要判断数据的安全性,这样出错的几率就会很小,尤其是要判断它的类型安全,是否为空等,不然程序会奔溃。还有需要注意的地方就是,写每一个函数的时候要多方面进行考虑,考虑代码的合法性。使用前不判断参数的正确性,在函数内部对参数的可靠性进行判断。如果这样的话,你用到函数的时候都需要对这些参数进行判断其合法性如果放倒函数中那么只需要判断一次就可以了。
8.应用内购买
9.利用sqlite创建索引,索引是关系数据库中用于存放每一条记录的一种对象,主要目的是加快数据的读取速度和完整性检查。索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。
10.数据库版本的更新,当应用数据表需要添加新表的时候,需要对数据插入新的字段,那么久需要更新数据库
11.友盟统计,当应用上线后可以观察到应用的日志文件,crash日志,页面记时日志,收集并归类崩溃日志,提供错误管理及分析工具,帮助开发者更好的解决问题,从而提高应用的稳定性,改善应用质量。
12.可以获取手机上的语言?你知道吗
13.使用js的时候需要使用webView
[webView stringByEvaluatingJavaScriptFromString:scriptString];
14.做常用设备登陆的策略可以使用服务器,服务器把所有登陆过的设备都存储下来。
15.涉及到系统偏好设置的选项,把它都放到一个文件中,这样修改起来比较容易。
16.利用VVDocumenter-Xcode
自动生成注释,也就是xcode的插件.运行VVDOcumenter-Xcode编译后,重新打开xcode即可以使用了
17.如何使用xib进行界面的搭建
利用file’s owner进行关联,形如storyBoard中的segue
18.如何在一个项目中使用多个storyBoard
19.如何利用代码与storyBoard或者XIB进行自动布局
20、XIB进行国际化
首先在工程中需要添加你想要使用的语言,然后新建视图的时候选择使用XIB,这样xcode就会自动为你新建一个xib文件,然后在inspector中的localization中选择localized,开始时一定要选择base,然后勾选其他语言,这样你发现XIB文件会有子目录,然后在子目录下你可以设置不同的语言翻译。
21.tableView小技巧
根据设置不同的identifier取出不同类型的cell,在设置identifier的时候可以设置成类名,这样的话就可以省很多事,而且很方便。
22. 技巧
[[UIApplication sharedApplication] setStatusBarHidden:YES];
23.版本控制
gitLab和sourceTree结合使用对源代码进行管理,如何进行相关的配置
24.发送语音消息
三方库opencore-amr
25.Sqlcipher+FMDB,数据库文件加密
https://www.zetetic.net/sqlcipher/ios-tutorial/
26.技巧
图片浏览XHImageViewer
28.技巧
根据button的不同状态可以设置button的事件,相当于微信发送语音信息的按钮,按住录音,松开结束录音并发送消息,
29.技巧
把block指针变量设置成私有的,这样是不是很好用。
30. 功能说明
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(overtimeRemind) object:nil];
先看这段代码:
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(showLeft) object:nil];
[self performSelector:@selector(showLeft)];
}
为什么[self performSelector:@selector(showLeft)];前面还需要调用cancelPreviousPerformRequestsWithTarget:self方法呢?
那是因为有时候我们通过[self performSelector:@selector(showLeft)];来实现showLeft方法,可能会出现延迟执行或内存泄漏的问题,而前面加上这句话:
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(showLeft) object:nil];
可以先将这在执行的方法取消,在继续执行,有效避免了上述两个问题。
31.runLoop
关于runloop的一些了解,runloop是一种运行池,是和多线程有关的东西,监听事件的产生,如果有新事件,那么runloop会监听,一旦监听到了,就会执行监听到的方法。
32.技巧
关于用户头像的问题,点击放大,等其他手势的库ESImageViewController
33.技巧
NSString *pullSuccessIdString = [pullSuccessMsgIds componentsJoinedByString:@","];
把数组中的每个元素用逗号拼接成一个字符串
34.数据共享
Multipeer Connectivity Framework ,近距离通信,双方建立连接后可以彼此进行通信
35.问题
oc中不支持多继承,也就说一个类只能继承至一个类,不能继承多个类。实现多继承可以使用协议来实现,也就说某个类中可以继承多个协议,这久相当于多继承,我可以拥有很多协议并且实现它。
36.multipeerConnectivity的实现,对文件进行共享
37.indexPathForSelectedRow
38.如何给另一台电脑进行真机调试
《1》导出p12文件
《2》导出描述文件
《3》在另一台电脑上双击即可以安装了
39.问题
[[NSBundle mainBundle] pathForResource:@"quickLookWord" ofType:@"docx”];
找不到文件目录
,[NSBundle mainBundle]其获取的路径是你程序的安装路径下的资源文件位置。 在xcode中采用add file to 方式添加文件时,一般情况下xcode会自动将文件添加到你的资源文件,而且,这些文件在你工程的 build Phases中的 copy Bundle Resources中可以查看到。但是有时候,由于xcode的问题,采用add files to 不能自动添加到你的资源文件中,这时,可以采用copy Bundle Resources下面的“+”号,手动将文件添加到你的资源文件中,这样就可以解决问题了。
40.功能实现
实现文件的一些操作,包括文件的近距离通信,MC,AirDrop,文件预览
41.Uniform Type Identifiers (UTIs)统一标示符(UTIs)
当你把图片分享之其他iOS设备,接收方会自动打开拍照类app并加载图片。如果你传递的是PDF文件,接收方设备可能会提示你选择一个app来打开文件,或者直接在iBooks中打开。iOS是如何知道哪个app适合什么样的数据类型呢?
在系统中,苹果用UTIs来处理数据类型的标示。简单的说,一个uti是用来标示特定类型的数据或文件。例如,com.adobe.pdf标示一个pdf文件,而public.png代表一个PNG图片。在这里可以查看已经在系统中注册了的完整的UTIs清单。(love cc cat)应用程序可以打开在iOS系统中已经注册了的UTI。因此无论文件是否被打开,iOS都会用特定的程序打开这个文件。
42.关于info.plist文件的操作
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
NSString *name = [infoDictionary objectForKey:@"CFBundleName"];
NSString *version = [infoDictionary objectForKey:@"CFBundleVersion"];
43.URL Scheme
是类似http://,ftp://,afp://这样的东西,通常是用传输协议作为URL Scheme。不过事实上,你可以在iOS和Mac中注册任何类型的URL Scheme。当用户在浏览器中访问你的自定义URL Scheme的链接的时候,操作系统就会打开你的程序,响应这个请求。
要在程序中注册自定义URL Scheme非常简单。主要分为两个步骤:在程序的Info.plist中加入你需要注册的URL Scheme,然后在你的应用程序中加入处理这类请求的代码。
其中,第一个步骤对于iOS和Mac应用程序来说是完全相同的。方法如下:
在Info.plist中,增加一个字段,名称为CFBundleURLTypes(URL Types)。Xcode会自动为你创建一个必须的键:URL Identifier(CFBundleURLName),这个键的值可以赋值为一个唯一的字符串。通常是逆向的域名结构,如:me.venj.myapp。然后在URL Types这个键下增加一个子项:CFBundleURLSchemes(URL Schemes),这里填入你想注册的URL Scheme的名称,如:cloud。你可以增加多个URL Scheme。
44.在我的APP中打开其他的App
那怎样来制作从一个应用打开其他应用,这其实很简单,打开info.plist,添加一项URL types,展开URL types,再展开Item1,将Item1下的URL identifier修改为URL Scheme,展开URL Scheme,将Item1的内容修改为myapp其他程序可通过myapp://访问此自定义URL。其实就是类似下面的样式。
https://appsto.re/cn/YSJRZ.i
45.问题
添加约束后,当想改变约束的时候,可以更具约束获得约束的值。比如我设置了高的约束是20,那么我以后想把高的约束改为40,那我咋么办,我需要根据这个约束进行修改。或者我需要根据某个约束获取起约束的值,那么我也需要根据约束来获得它的值。
46.关于自动布局修改约束
如果给一个视图添加了约束,你可以修改约束,来改变之前所添加的约束
ContentHightConstraint.constant = 150; 修改之前的约束
47.用通知中心的缺点别人看代码比较
48.问题
NSTimer不能归档持久化,只有实现了NScode协议的才能持久化,即使是归档也不好使,不知道有没有一种方法可以进行序列化
49.技巧
在iOS7之后我们可以用UIFont的preferredFontForTextStyle:类方法来指定一个样式,并让字体大小符合用户设定的字体大小。通过手机设置app字体的大小。目前可供选择的有六种样式:
50.mac终端命令
vi 文件名
q!强制退出
i编辑模式
esc commend 模式 shift +double click z 保存并推出
cat 文件名,查看文件内容
51.Debug的一些有用的操作
截取屏幕图,debug---》view debugging ——>take screenshot of iPhone
查看view的frame debug ——> show view frame
52.真正懂得自动布局吗?
自动布局会自动根据约束进行计算view的frame,所以你添加的约束必须保证能正常就算出view的frame,如果不能那么你就需要添加约束,也就是说,你既不能多添加了约束也不能少添加约束,UILAbel如果不添加高度约束,它会自动帮你计算出高度的。总的来说,只要让自动布局知道视图的frame就行。如果不能知道,那么会报错
42.你的视图有比较简单的布局改变
当需要产生动画或动态添加视图时,autolayout就暴露了出我认为让人抓狂的元凶——优先级(Priority)和布局冲突。 autolayout对于相同方位的约束,如都是描述离superview上边缘距离的约束,如果这两个约束的数值不同,但是优先级一样,则 autolayout将报布局冲突,将会根据其计算丢弃某一条约束(这时可能就会丢弃你想要的约束,而恰恰保留了你不想看到的布局)。所以,当我们发生布 局变化时,无法像frame的绝对定位,直接改变,并且只有唯一的位置信息。那么,我们该怎么处理这种布局冲突呢?那就是让描述相同但数值不同的这两个约 束采用不同的优先级。autolayout默认将使用数值较大的优先级约束。
但是当我们新增了一个更高优先级约束改变了视图布局,在完成一些操作后,又想变回去怎么办?这时就必须删除更高优先级的约束。
所以,对于视图有动态变更时,我的通常做法是:为需要变更的控件新增默认constraint,但对于这个默认constraint先降低优先级,在发生 变化时再新增一个更高优先级的constraint2,且代码中用一个Dictionary缓存该constraint2的对象,便于我随时删除或重新新 增,让视图来回变化。
53.AD-hoc 是干什么的
是在把app发布到store上进行测试用的。也就是说我把对方设备好添加进来,我打一个包给对方,对方就可以通过itune安装这个ipa文件,就可以进行真机测试了,不需要通过xcode进行安装了。
54.枚举的定义方法
enum {
UITableViewCellStyleDefault,
UITableViewCellStyleValue1,
UITableViewCellStyleValue2,
UITableViewCellStyleSubtitle
};
typedef enum {
UITableViewCellStyleDefault,
UITableViewCellStyleValue1,
UITableViewCellStyleValue2,
UITableViewCellStyleSubtitle
} UITableViewCellStyle;
typedef NS_ENUM(NSInteger, UITableViewCellStyle) {
UITableViewCellStyleDefault,
UITableViewCellStyleValue1,
UITableViewCellStyleValue2,
UITableViewCellStyleSubtitle
};
typedef enum {
UITableViewCellStyleDefault,
UITableViewCellStyleValue1,
UITableViewCellStyleValue2,
UITableViewCellStyleSubtitle
};
typedef NSInteger UITableViewCellStyle;
55.如果页面上的数据是在服务端,且服务端的信息可能会随时改变。那么我们需要把每次请求数据确保每次的数据是最行的数据。但是每次加载数据是不难免会很影响用户体验,所以我需要本地缓存数据。页面先加载本地数据,然后在进行网络请求加载数据。等网络请求数据成功以后,在把新加载进来的数据更新UI
56.数据库的一些操作
sqlite> CREATE TABLE testtable (first_col integer DEFAULT 0, second_col varchar DEFAULT 'hello');
sqlite> CREATE TABLE testtable (first_col integer UNIQUE);
sqlite> CREATE TABLE testtable (first_col integer CHECK (first_col < 5));
sqlite> ALTER TABLE testtable ADD COLUMN second_col integer;
sqlite> CREATE VIEW testview AS SELECT * FROM testtable WHERE first_col > 100;
sqlite> CREATE TEMP VIEW tempview AS SELECT * FROM testtable WHERE first_col > 100;
sqlite> DROP VIEW testview;
57.uitextView获取光标的位置
int location = aTextView.selectedRange.location;