iOS技术知识盘点二(全面覆盖技术知识点)

1> UINavgationController使用
  • 导航控制器之间切换供用一块导航条!
  • 导航条的内容由栈定控制器决定!
  • 显示在我们眼前的永远是栈顶控制器!
  • 左上角的返回按钮文字是特例由上一个控制器决定!

2> Storyboard 显示调整
  • 改成横屏显示
  • Storyboard显示以及界面上调成上下样式!


3> Segue用法















  // 执行某一个Segue,完成界面跳转
[self performSegueWithIdentifier:@"haha" sender:nil];

/**
 * 
执行 segue , 跳转之前会调用这个方法
 * 
一般在这里给下一个控制器传递数据
 *  @param segue  UIStoryboardSegue
拿到 segue
 */

- (
void )prepareForSegue:( UIStoryboardSegue *)segue sender:( id )sender
{
    // 这里也不需要写跳转控制器的真实类型用 UIViewController 赋值
   
NSLog ( @"%@--%@--%@" ,segue. identifier ,segue. sourceViewController ,segue. destinationViewController );
}

4> 自定义cell
  • cell的frame由tableView决定;
  • cell的分割线样式同样也属于tableView决定所以只能通过tableView来设置;
  • cell内部的子控件你要改变frame同样在 - (void)layoutSubviews 里面进行布局;

5> 动画设置更加协调
[ self . switchView setOn : YES animated : YES ];
[self.checkBox setOn:NO animated:YES];

6> UIPickerView会崩溃的原因
和UITableView一样有代理和数据源方法 但是如果只有一列那么还是必须要写出来这就和UITableView不一样了!

7> Xcode 快捷键
CMD + option + [  整体往上移
CMD + option + ]  整体往下移

8> tableView 不通过传递indexPath 取得选中的行号
NSIndexPath *path = [ self . tableView  indexPathForSelectedRow ];

9>  控制器的界面是延迟加载的用到时候再去加载所以在给控制器传递数据的时候重写setter方法拿到数据是null为空只能在viewDidLoad方法中拿到

10>  面向对象 面向模型 传递模型对象改了 模型改了 那么如论怎么传递 我这个界面也就改了!内存地址是一样的!

11> 数据存储    
// 1. 沙盒的根路径
NSString *home = NSHomeDirectory ();
// 2.Document 路径 (PathComponent 会是路径的一部分会自动加/所以不要用别的方法 )
NSString *path = [home stringByAppendingPathComponent:@"Document"];

  • XML(属性列表)plist存储 只能存基本OC对象 自定义的对象不能存储 但是不会奔溃
  •   Preference(偏好设置)存储 以键值对的形式进行存储 同步数据 synchronize 不写的话也行但是不确定什么时候同步简简单单存键值对的时候
  •     NSKeyedArchiver归档 子类继承父类一定要看父类里面有没有归档或者解档属性 要先调父类的方法!
  •     SQLite3
  •     Core Data

12>  iOS应用添加新的字体
  • 拿到所有的字体
- ( void )getAllFontName
{
   
NSArray *familyNames = [ UIFont familyNames ];
   
for ( NSString *familyName in familyNames) {
       
printf ( "Family: %s \n" , [familyName UTF8String ] );
       
NSArray *fontNames = [ UIFont fontNamesForFamilyName :familyName];
       
for ( NSString *fontName in fontNames ){
           
printf ( "\tFont: %s \n" , [fontName UTF8String ] );
        }
    }
}

13>  绘图
- ( void )drawRect:( CGRect )rect
{
   
}
  • 实现了这个方法那么内部的自定义的view就无效了要把 drawView.backgroundColor = [UIColor clearColor];

14>  Unicode编码
  • \U5929\U5929\U9177\U8dd1 —> 一个\代表一个汉字

15>  类名前缀(创建的类自动添加自己的类名前缀)

16> AFN 添加请求头增加token

17>  MAC快捷键
  • 不小心把屏幕放大了
  • command + -  // 等比缩放
  • command + 0 // 缩小到原倍数

18>  公司生存法则
  • 在公司里面生存的法则 有些代码 会看着让你头疼 但是他就是能做出功能!你会很佩服 所以先实现功能 再优化!生存法则~先把功能实现不要要求代码质量~
  • 思考问题我们应该考虑 很多方面的实现 考虑相当于是什么!

19>  图标的问题
  • iPhone 上显示程序的图标
  • AppStore 上显示程序的图标
  • Spotlight 上显示程序的图标

  • 像素和点的问题
  • 非retain 1 点 - 1像素
  • retain 1点 - 2像素
  • [UIImage imageNamed:@“bin_left”];
  • 首先自动去检测手机是不是视网膜屏幕其次自动加载图片
  • 启动图片在程序启动的时候加载的图片启动完成之后会自动消失在安卓中要自己写代码
  • xcode删除storyboard 然后报错 Could not load NIB in bundle
  • 要在info.plist中删除Main.storyboard 

20> 清掉所有数组中的元素
  • [self.view.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];

21> Xcode Warning 集合
  • code will never be executed  // 代码永远将不会被执行

22> cell循环利用
  • static 修饰局部变量 : 可以 保证局部变量只分配一次存储空间(只初始化一次)
  • 为什么不写成宏?第一只有这个地方用!第二不要让外部随意的访问!
  • 不用缓存池的会销毁 —> 方法的调用频率比较高
  • 间接取用KeyPath

23> How Do I Declare A Block in Objective-C?

24> 通讯录使用
  • 改系统自带通讯录 改值之后 放在最后统一一次性更新

25> OC底层将OC代码转成C++代码
  • clang -rewrite-objc + 文件名字 —> 生成C++的代码
  • 研究底层的代码 一般()扩起来的都是强转 那么删掉这些进行强转是可以的
  • 运行时动态增加成员变量(首先消失机制)


遍历这个类获得所有的成员变量


  • block究竟放在什么地方: 堆\栈

  • block 本质是指向结构体的指针 把变量保存起来 

  • 默认情况下,任何block都是在栈中,随时都可能被回收(执行完代码块那么就会被回收) 如果想长期拥有一个block 那么必须放在堆里面 对block做一次copy操作,block的内存就会放到堆里面Block_copy(myblock)

26> Storyboard 搭载控制器

27> 静态库
  • 库 : 开源/闭源
  • 闭源:静态库/动态库
  • 静态库:.a和.framework  链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多次冗余拷贝
  • 动态库:.dylib和.framework  链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存
  • *项目中如果使用自制的动态库,不能被上传AppStore (苹果官方自己使用)
  • 可以生成真机和模拟器俩个静态库,真机的内存会比较大 模拟器的内存笔记小 可以合并成一个 执行指令 相+ 就行
  • 静态库中使用OC的分类(或者其他框架的东西) 默认是不会链接进来 所以要 改一下链接 -ObjC 链接所有OC相关的东西的 
  • 制作.framework 的框架过程就像对复杂 但是有第三方框架帮我们来实现
  • 分析内存泄漏 debug版和release版
  • 内存泄漏测试 instrument2 使用

28> 统计应用崩溃报告和程序员专门技术回答的网站
  • crashlytics 统计应用崩溃 崩溃服务报告统计 把东西发不到githup上面去
  • stackoverflow.com  程序员专门技术的问答网站

29> 多种打包ipa的方式
  • 打包ipa文件
  • 非越狱软件 : AppStore ,archive
  • 越狱软件: 91市场\pp助手\iTool,ipa(APK,zip)

30> 单元测试
软件测试
  • 单元测试 : 测试范围最小,仅仅是测试一个小单元(比如说一个方法\函数)对软件的稳定性有很大帮助;
  • 集群测试 :测试防伪比较大,测试项目中的所有功能
  • 压力测试 :  模仿很多用户,很多请求进行测试

项目中默认自动创建单元测试的target 
测试驱动开发
  • 必须以对象方法开头 
  • 方法名必须以test开头
  • - (void)testMath

单元测试有个非常牛逼的概念  // 断言\猜测\估计
单元测试2大颜色
  • 红色 : 测试失败
  • 绿色 : 测试通过
XCTAssertEqual (内部函数和方法放在一起) 其次对类的方法进行一次性全部性测试后完成一个类

单元测试的好处
  • 把一个类的方法独立到另外一个类中进行测试
  • 非常直观的看出这个报错
  • 非常轻量级的体现(只需要非常简单的测试不需要跑起整个程序)
  • 不同的类创建不同的单元测试类

31> 开动一个功能前
  • 先研究美工或者后台提供的东西然后再开动!
  • UI控件内部初始化init —> 会自动调用initWithFrame:方法所以建议重写initWithFrame:来进行初始化

32> iOS 开发封装思想和代码分层的体现!
  • 谁最清楚这个事情谁就应该负责!
  • 内部的子控件谁拥有谁就应该管理这些内部的细节而不应该暴露在外部!
  • 每个人写代码要往前看,发现问题,写完之后想一想,我这样写好不好,我这样写对不对,我这样写会不会影响后面的代码扩充,这样写会不会导致控制器代码很冗余,控制器管了很多事,知道太多,死的惨不惨!控制器作为容器不应该知道太多!
  • 要尽量做到要业务细节屏蔽在某个view或者类里面!

33> 适配iOS6&iOS7
  • 导航栏背景
  • iOS 6 : 状态栏20的高度不属于控制器
  • 非retain 320 * 44
  • retain 640 * 88

  • iOS7 : 状态栏和导航栏同化
  • 640 * 128

34> 代码的思想
  • 代码应该放到最合适的地方去调;
  • 不要瞎扯蛋;
  • 想把控项目的一切 首选重写系统的控制器 拦截系统的操作 继承—> 重写
  • 多个界面所做操作所执行的方式一样的时候 那么首选 initialize 这个方法 系统在首次使用这个类的时候调用
  • 状态栏的隐藏和显示首先根据美工给的图片看尺寸(一般在启动的时候隐藏在启动完成后显示出来)

35>  Git 常用命令  

36>  Xcode 自带的Git 提交方式
首先 Commit (可能出现同步问题) —> Update and Pull (然后更新) —> Push (最后push在网站上面)

37>  Runtime 10种用法 http://ios.jobbole.com/87415/

38>  涉及框架与框架之间的转换用到桥接的技术 

39>   /**
     *  项目业务逻辑梳理:
     *  1.BaseTableViewController
所有控制器的基类 ( 后面的一级 , 二级 , 或者 List 界面 , 以及编辑或者添加界面都继承
     *  BaseTableViewController *
关注这里面的数据类型和提供的方法第一自定义的 navgationBar 提供的各种方法 , 子类重载的问题 )
     *
     *  2.LoginViewController
登陆控制器点击登陆后发起请求如果成功 ( 通知代理 ) 是借用第三方的侧滑框架进行加载显示一级界面
     *
     *  3.FirstViewController
显示在延迟加载方法中发起俩次请求 , 请求整个项目的框架结构一级后续的枚举列表结构并且根据请求的结构
     * 
创建对应的模块内容 -->SecondViewController 同理根据上级传递过来的模型来创建对应的模块 ( 有可能模块里面还有模块那么是保持
     * 
SecondViewController 不动 )-->AGZListViewController 同理根据上级传递过来的模型来判断是要显示 (ListVc)--
     *  >AGZListViewController
里面可能只有 tableView( 一种情况点击 cell 进行控制器的跳转 , 一种情况整个 ListVc 继承自 BaseVc 上面 )
     * 
titleBar 上面按钮创建和返回的代理方法实现 ( 新创建的按钮 )-->AddAndEditViewController 根据传递的模型来判断是保存还是
     * 
新建或者什么样的样式而选择控制器 ( 类型展示 )
     *
     *  4.AddAndEditViewController
这里面就是枚举数据模型进行一行一行的解决结合 cell 进行处理
     *
     *  5.DataService
数据模型的请求和处理 ( 继承 BaseService 拥有父类的值直接赋值进行传递 )-->BaseService( 网络数据模型的请求 )
     * 
和解析模型在并且对模型赋值在 FirstViewController 拿到模型根据模型设计 UI 界面
     *
     */
40>  通知代理一种写法貌似更加严谨
  • - (void)backDown
  • {
  •     if(nil != self.delegate && [self.delegate conformsToProtocol:@protocol(TopTitleBarDelegate)] && [self.delegate respondsToSelector:@selector(returnAction)]){
  •         [self.delegate returnAction];
  •     }
  • }

41> 测试接口

42> 在线json 解析和处理

43> 在线get和post测试

44> iOS 报错Expression is not assignable 属性不能修改OC —> C 语言的语法修改上的问题

45> The file “Info.plist” couldn’t be opened because there is no such file —>报出这种错误移动了文件的.m/info.plist文件

46> warning: no rule to process file —> 这种报错

47> "_deflateEnd", referenced from:   -[ASIDataCompressor closeStream] in ASIDataCompressor.o 引用第三方库这样的报错 

49> 模拟器联合调试的框架  DocumentView  & DCIntrospect

50>  创建侧滑控制器的框架  MMDrawerController

51>  访问通讯录的框架  SYContacterPicker 会创建多选多项解决问题

52 > AFN同步异步请求


54 pch 和 info.plist 修改绝对路径

55 > 相对路径修改  $(SRCROOT)/HT_aigongzuo/Classes/Other/Info.plist 3 部分

56> Git 全局性的忽略 .DS_Store 

57>  Xcode 忽略警告的提示 

58> 一个数组取模型快速的方式

59> Xcode 打开折叠代码的功能 

60> Xcode Warning: No rule to process file xxx解决

61> 在线正则表达式测试

62 > MAC中 隐藏和显示隐藏文件 

63 >  MAC上将App打包成.dmg格式

64 > MAC上精品app

65 > 微博展示思路分析
  • 1> 分析思路 首先能滚动 每一行其实差不多长的一个样子 那么想都不用想 用tableView 实现 可是每一行间距高度也不一样所以 我们要自定义cell
  • 2> UITableViewController 黄黄的都是控制器 直接来实现
  • 3> 字典中 键值对 不一样的状况!一次性全部写出然后选择性展示!
  • 4> jpg文件放在Supporting Files中 然后png 放在image文件中!

  • 通过代码自定义cell
  • 1> 新建一个继承自UITableViewCell的类
  • 2> 先在initWithStyle:初始化在将有可能显示的子控件全部添加进来
  • 3> 提供一个模型属性
  • 4> 重写模型属性的setter方法
  • 5> 设置数据模块不一定每个地方都是一样的 如果设置了 hidden 的地方一定要设置相反的设置回来
  • 6> 循环利用一个致命的缺点 一定要保证所有的状态和数据全部被换掉所以有YES的地方一样要有NO 并且设置的数据一定要覆盖并且清楚尤其状态
  • 7> 设置固定死的数据那么我们只需要进行一次性设置那么写在初始化的方法中就足够因为写来写去都只会
  • 8> cell行高 必须要拿到每一行cell内部的高度 才能计算cell的高度 可是系统调用方法导致这一点不可能!先得拿到全部的行高才能设置数据显示数据!那么问题来了 我们不能拿到 所以我们只能够在加载数据的时候就算好高度 然后给需要的地方用!
  • 9> 封装frame模型的思想 并且只是readonly的 因为是readonly 所以没有生成setter方法 不能通过点语法访问 只能_XXXX

66 > QQ好友列表展示思路分析
  • 1> 模型中有模型嵌套如何转换的问题!
  • 2> 为什么在懒加载中模型用的是NSArray 安全性 从设计编译的角度看 你的同事拿到这个东西就不能乱添加数据而影响结构!
  • 3> 在自定义cell和headerFooterView为什么要传递tableView进来因为他需要用tableView 去缓存池根据标识来取!
  • 4> headerFooterView 其实也都是长的一个样子 那么为什么不用xib来描述 这个东西比较的新 xib不支持这个东西来描述
  • 5> 在UI布局中能填充就填充不需要来计算y值!
  • 6> 任何UI控件再调完方法之后都是没有值的!有init 方法推导出来!
  • 7> headerFooterView 宽度高度不需要设置 tableView 内部已经屏蔽 所以tableView 有多宽view就有多宽高度可以自己设置!外部如果改了设置更改了frame 内部会自动调用layoutSubViews 方法
  • 8> 一个用来对齐常规代码的插件 —> XAlign 
  • 9> 按钮默认设置的属性是居中的 如何设置左右对齐 按钮内部有Control Alignment 属性来设置
  • 10> 控制按钮的内边距属性 可以设置整个按钮 也可以设置图片和文字
  • 11> friend —> Xcode 来写这个 会显示红色 Xcode 支持 C++ 而 C++ 里面 friend  代表 // 友元函数\友元类
  • 12> 我们可以拿到按钮内部所有的东西 如果要旋转 我们应该用到transform如果不能直接旋转那么分析首先可能是autoLayout 限制了!如果不能执行这些操作那么也要分析 尤其在tableView 中只要刷新表格那么他就不会管缓存池 去重新创建的!内存地址不一样!
  • 13> 所以这个时候我们要考虑既然内存地址改变可是父类地址没有 当一个控件添加到父类中的时候会调一个方法 didMoveToSuperView 我们应该拿到最新的来进行处理!

67 > 应用管理分析思路
  • 1> 通过storyboard 来创建cell 首先这个cell 必须是动态的 然后必须得绑定一个标识;
  • 2> 通过storyboard 来创建cell 是比较高级的 直接创建就好!根本不需要判断空不空 他是通过app标识去缓存池中看,有没有这样的cell,如果没有就去storyboard中找如果有就照着这个某子刻一摸一样的出来!
  • 3> 如果cell用的是系统自带的样式那么就是固定死了的 不允许往里面 拖任何东西
  • 4> 做循环利用的时候 俩点: 1: cell的数据要覆盖 2: cell的状态要覆盖

68 怎么重写pickerView中的自定义每一个小格子?

69 > 单例模式

70


猜你喜欢

转载自blog.csdn.net/zz_iosdeveloper/article/details/54290074