现在的位置: 首页 > 综合 > 正文

OC复习

2018年01月23日 ⁄ 综合 ⁄ 共 8400字 ⁄ 字号 评论关闭
  1. <span style="font-size:18px;">类的方法  
  2.   
  3. 1.在加号方法中不能使用实例变量,实例变量是依托于对象存在的只有有了对象,实例变量才会有空间  
  4.   
  5. 2.self 谁调用该方法,self就代表谁  
  6.   
  7. 当方法是一个减号方法时, 调用该方法的对象是谁,self就代表当前对象  
  8.   
  9. 当方法是一个加号方法时, 调用该方法的类是谁,self就代表当前类  
  10.   
  11. 3.实例变量的可见度:  
  12.   
  13.     @public:公共的,在任何文件中都可以访问,访问方式是通过实例对象->实例变量.(per->name)  
  14.   
  15.     @protected:受保护的,有一定的访问权,只允许在本类文件以及子类文件中访问,其他文件按不可以访问.  
  16.   
  17.     @private:私有的,只允许在本类文件中访问,不可以在子类文件中以及其他文件中访问.  
  18.   
  19.     默认的可见度是@protected  
  20.   
  21.     为什么不声明为@public?  
  22.   
  23.     1.声明为@public的实例变量,外部就可以访问以及修改,会影响到内部的一个实现,暴漏实现细节  
  24.   
  25.     2.违背了OC面向对象的三大特征之一:封装(封装的思想是隐藏内部实现,提供外部接口)  
  26.   
  27.     为什么不声明为@private?  
  28.   
  29.     1.声明为@priviate的实例变量,子类文件访问不到,所以子类文件还要重新定义  
  30.   
  31. 2.违背了OC面向对象的三大特征之一:继承.(父类的东西子类也有,可访问)  
  32.   
  33. 4.setter 和 getter 方法  
  34.   
  35. 继承  
  36.   
  37. 1.  子类继承父类保留自己独有的实例变量.  
  38.   
  39. 2.  子类可以继承父类除了private以及私有方法以外的实例变量.  
  40.   
  41. 3.  继承是单向的,具有传递性  
  42.   
  43. 4.  导入头文件时,直接导入子类头文件即可.  
  44.   
  45. 5.  子类可以重写父类的方法  
  46.   
  47. 6.  私有方法:在.m文件中实现,但是没有在.h文件中声明的方法,叫做私有方法,私有方法不允许在外部访问,但是  
  48.   
  49. 可以在本类中访问.  
  50.   
  51. 7.  子类重写父类有三种情况(1)只要父类的(2)只要自己的(3)既要父类,又要自己.  
  52.   
  53. 8.  父类具有子类共同的特点和行为.  
  54.   
  55. 9.  每个类只需要初始化独有的实例变量.  
  56.   
  57. 10.   Self用来调用自己的方法,super是用来调用父类方法的实现.  
  58.   
  59. 11.   初始化过程中要判断父类的初始化是否成功,若成功,在继续初始化当前类的特有特性.若不成功,不在初始化.  
  60.   
  61. 12. 便利构造器  
  62.   
  63. 快速创建对象,内部封装了创建对象的过程.  
  64.   
  65. +号方法,返回值类型为id类型,以类名+ with开头,拼接上多个参数.  
  66.   
  67. NSString类的常用方法  
  68.   
  69. 1.创建对象的两种方法  
  70.   
  71. (1).在main函数里先通过alloc开辟空间,然后初始化  
  72.   
  73. (2).便利构造器,也就是把第一种方式封装在类的实现部分,使用时直接用类调用即可  
  74.   
  75. 2.求字符串长度  
  76.   
  77. NSUInteger length= [str length];  
  78.   
  79. OC中的字符串结尾没有\0,这也是和C语言中有区别的地方  
  80.   
  81. 3.获取某一个字符  
  82.   
  83.  characterAtIndex:  
  84.   
  85. c语言中是通过数组名+下标  
  86.   
  87. 4.判断字符串是不是以给定的字符串开头或者结尾  
  88.   
  89. 判断开头hasPrefix:  
  90.   
  91. 判断结尾hasSuffix:  
  92.   
  93. 5.查找指定字符串的范围  
  94.   
  95. rangeOfString:  
  96.   
  97. 返回的是开始位置和长度  
  98.   
  99. 可以用NSRange 类型变量来接收  
  100.   
  101. 方法NSStringFromRange能够将NSRange类型的结构体变量转换为字符串对象,方便使用  
  102.   
  103. 6.从字符串中获得子字符串  
  104.   
  105. (1).获取给定下标之后的字符串,需要注意的是包含给定下标对应的字符  
  106.   
  107. substringFromIndex:  
  108.   
  109. (2).获取给定下标之前的字符串,需要注意的是不包含给定下标对应的字符  
  110.   
  111. substringToIndex:  
  112.   
  113. (3).获取给定范围的字符串  
  114.   
  115. substringWithRange:  
  116.   
  117. 在指定范围时用NSMakeRange()指定开始位置和长度就行了  
  118.   
  119. 7.字符串拼接  
  120.   
  121. stringByAppendingString:  
  122.   
  123. stringByAppendingFormat:  
  124.   
  125. 第二种拼接时可以设置格式串  
  126.   
  127. 8.替换字符串  
  128.   
  129. (1)将指定字符串替换成另外指定的字符串  
  130.   
  131. (2)将指定范围的字符串替换成另外指定的字符串  
  132.   
  133. 9.字符串比较  
  134.   
  135. compare:  
  136.   
  137. 需要注意的是返回值类型是NSComparisonResult  
  138.   
  139. 结果只有-1,0,1三种情况  
  140.   
  141. 10.字符串转换成数值类型  
  142.   
  143. C语言基本数据类型+Value  
  144.   
  145. 如:intValue  
  146.   
  147. 11.字符串大小写转换  
  148.   
  149. (1)全部大写  
  150.   
  151. uppercaseString  
  152.   
  153. (2)全部小写  
  154.   
  155. lowercaseString  
  156.   
  157. (3)首字母大写  
  158.   
  159. capitalizedString  
  160.   
  161. NSMutableString 类的方法  
  162.   
  163.    
  164.   
  165. 对于NSMutableString 类,因为这是可变的字符串类,所以字符串的增删改查方法都是在原字符串基础上修改  
  166.   
  167. 1.拼接  
  168.   
  169. appendFormat:  
  170.   
  171. 2.删除  
  172.   
  173. deleteCharactersInRange:  
  174.   
  175. 3.插入  
  176.   
  177. insertString:atIndex:  
  178.   
  179. 4.替换  
  180.   
  181. replaceCharactersInRange:withString:  
  182.   
  183. 数组类  
  184.   
  185. .NSArray常用方法  
  186.   
  187. 1.创建数组对象  
  188.   
  189. (1).用便利构造器的方法创建数组对象  
  190.   
  191. 示例:  
  192.   
  193. NSArray *arr1=[NSArrayarrayWithObjects:@"baidu",@tencent",@"xiaomi",@"alibaba",  
  194.   
  195. @"taobao",@"cctv", nil nil];nil是元素截至的标志符  
  196.   
  197.  NSLog(@"%@",arr1);  
  198.   
  199. (2)用初始化的方法创建数组对象  
  200.   
  201. 示例:  
  202.   
  203. NSArray *arr=[[NSArray alloc]initWithObjects:@"baidu",@tencent",@"xiaomi",@"alibaba",  
  204.   
  205. @"taobao",@"cctv",nil];  
  206.   
  207. NSLog(@"%@",arr);  
  208.   
  209. 2.获取元素个数  
  210.   
  211. 示例:  
  212.   
  213. NSUInteger count= [arr count];  
  214.   
  215.  NSLog(@"%lu",count);  
  216.   
  217. 3.根据索引值获取对象  
  218.   
  219. (1)获取指定下标对应的元素  
  220.   
  221. 示例:  
  222.   
  223. NSString *str= [arr objectAtIndex:1];  
  224.   
  225.  NSLog(@"%@",str);  
  226.   
  227. (2)获取数组中的第一个元素(两种方法)  
  228.   
  229. 示例:  
  230.   
  231.  NSString *str= [arr objectAtIndex:0];  
  232.   
  233. NSLog(@"%@",str);  
  234.   
  235. 第二种方法  
  236.   
  237. 示例:  
  238.   
  239. NSString *str= [arr firstObject];  
  240.   
  241.  NSLog(@"%@",str);  
  242.   
  243. (3)获取数组中的最后一个元素  
  244.   
  245. 示例:  
  246.   
  247.  NSString *str=[arr lastObject];  
  248.   
  249. NSLog(@"%@",str);  
  250.   
  251. 4.获取对象在数组中的索引值  
  252.   
  253. 示例:  
  254.   
  255.  NSUInteger index= [arr indexOfObject:@"baidu"];  
  256.   
  257. NSLog(@"%lu",index);  
  258.   
  259. 5.判断是否包含某个对象  
  260.   
  261. 示例:  
  262.   
  263. BOOL isExist= [arr containsObject:@"dd"];  
  264.   
  265.  NSLog(@"%d",isExist);  
  266.   
  267. 6.数组排序  
  268.   
  269. 示例:  
  270.   
  271. NSArray *sortArr=[arr sortedArrayUsingSelector:@selector(compare:)];  
  272.   
  273. NSLog(@"%@",sortArr);  
  274.   
  275. 7.快速遍历  
  276.   
  277. 示例:  
  278.   
  279. for (NSString *str in arr){  
  280.   
  281.     NSLog(@"%@",str);  
  282.   
  283.  }  
  284.   
  285. .NSMutableArray 的常用方法  
  286.   
  287. 1.创建数组对象  
  288.   
  289. 示例:  
  290.   
  291. NSMutableArray*arr1 = [[NSMutableArray alloc] initWithObjects:@"baidu",@tencent",  
  292.   
  293. @"xiaomi",@"alibaba",@"taobao",@"cctv",nil];  
  294.   
  295. 2.添加元素  
  296.   
  297. 示例:  
  298.   
  299.  [arr1 addObject:@"wangyi"];  
  300.   
  301. NSLog(@"%@",arr1);  
  302.   
  303. 3.插入元素  
  304.   
  305. 示例:  
  306.   
  307. [arr1 insertObject:@"tianya" atIndex:1];  
  308.   
  309. NSLog(@"%@",arr1);  
  310.   
  311.   
  312.   
  313.     
  314. 耿智聪  23:12:33  
  315. 4.删除元素  
  316.   
  317. 示例:  
  318.   
  319. [arr1 removeObjectAtIndex:1];//移除单个元素  
  320.   
  321. NSLog(@"%@",arr1);  
  322.   
  323. [arr1removeAllObjects];//移出所有元素  
  324.   
  325. NSLog(@"%@",arr1);  
  326.   
  327. 5.替换元素  
  328.   
  329. 示例:  
  330.   
  331. arr1 replaceObjectAtIndex:3 withObject:@"zhihu"];  
  332.   
  333. NSLog(@"%@",arr1);  
  334.   
  335. 6.交换指定位置的两个元素  
  336.   
  337. 示例:  
  338.   
  339. [arr1 exchangeObjectAtIndex:0 withObjectAtIndex:6];  
  340.   
  341.  NSLog(@"%@",arr1);  
  342.   
  343. 7.排序(幼儿版),对原数组进行排序  
  344.   
  345. 示例:  
  346.   
  347. [arr1 sortUsingSelector:@selector(compare:)];  
  348.   
  349. NSLog(@"%@",arr1);  
  350.   
  351. 8.遍历  
  352.   
  353. for (NSString *str in arr1){  
  354.   
  355.     NSLog(@"%@",str);  
  356.   
  357.  }  
  358.   
  359. .NSNumber的常用方法NSNumber有两个常用的方法  
  360.   
  361. 1.将基本数据类型转为NSNumber类型的对象  
  362.   
  363. 2.将NSNumber类型的对象转为基本数据类型  
  364.   
  365. 字典类  
  366.   
  367. 1.一个key只能对应一个value 但是一个value可以对应多个key.  
  368.   
  369. 2.字典主要是用来存储有一一对应关系的数据  
  370.   
  371. 3.可变字典增加了:添加,删除,修改功能  
  372.   
  373. 4.其中删除和修改的方法相同为setObject: forKey: 原理:先根据指定的key查找字典中是否存在指定的key,  
  374.   
  375. 如果没有,则添加该key和对应的Value,如果存在,则修改key对应的value  
  376.   
  377. 5.对于字典的遍历,遍历的是字典的key,然后根据key的值取出value的值  
  378.   
  379. 要想获取字典中的value值,首先应得到key值,然后再根据key获取value的值.  
  380.   
  381. 集合知识点  
  382.   
  383. 6.集合具有无序性,互异性,确定性  
  384.   
  385. 7.获取集合中的元素是系统给定的,不是有序的,也不是随机的.  
  386.   
  387. 8.可变集合可以添加或移除元素  
  388.   
  389. block语法以及数组排序高级  
  390.   
  391. 1.  block 的定义  
  392.   
  393. int (^block)(intx, int y) = ^(int x, int y)  
  394.   
  395. {  
  396.   
  397. return x + y;  
  398.   
  399. };  
  400.   
  401. 其中, int (^)(int x, int y)  block变量的类型  
  402.   
  403. block  block 变量的名字  
  404.   
  405. ^(int x, int y)  
  406.   
  407. {  
  408.   
  409. return x + y;  
  410.   
  411. };  
  412.   
  413. block变量的初值,block用来存储函数,所给block变量赋值时赋的是整个函数的实现  
  414.   
  415. 当把函数的实现赋给block之后,block变量就可以当做函数名使用  
  416.   
  417. 2.  有关全局变量的知识点  
  418.   
  419. 有关全局变量的知识点  
  420.   
  421. (1)想要访问在其他文件定义的全局变量,需要在当前文件用extern 修饰才可以访问到  
  422.   
  423.  (2)两个文件都定义了一个相同名字的全局变量,而又只想访问当前文件的全局变量,需要在两个文件中定义全局变量  
  424.   
  425. 时都用static修饰为静态的即可  
  426.   
  427. 3.当在block内部使用外部定义的局部变量时程序会crash  
  428.   
  429. 原因:外部定义的局部变量在block内部当成常量使用,所以不能被赋值  
  430.   
  431. 解决方案:在定义变量时加上__block(注意有两个下划线),如__block int a = 10即可,然后再block内部就  
  432.   
  433. 可以当做变量使用  
  434.   
  435. __block的作用就是告诉编译器编译时不要把外部定义的变量在内部当做常量使用  
  436.   
  437. 但是,如果变量是全局变量则没有这个问题  
  438.   
  439. 也就是说在block中访问全局变量,不需要__block修饰  
  440.   
  441. 3.  数组排序高级  
  442.   
  443. 当对系统提供的类的对象升序排序时或者对自定义的类的对象排序时使用:  
  444.   
  445. sortedArrayUsingSelector:  
  446.   
  447. 当对系统类型的对象排序时,并且要降序排序时,使用block 方式的排序方法  
  448.   
  449. sortedArrayUsingComparator:^NSComparisonResult(idobj1id obj2)  
  450.   
  451. 属性  
  452.   
  453. 1.  属性使用来替代settergetter方法的新语法,用属性可以快速创建settergetter的声明和实现  
  454.   
  455. 定义属性是用关键字@propetry  
  456.   
  457. 2.  属性的特性  
  458.   
  459. (1)       读写特性  
  460.   
  461. readonly 和 readwrite 系统默认的是读写特性是readwrite  
  462.   
  463. (2)       原子特性  
  464.   
  465. atomic(原子特性),保证线程安全  
  466.   
  467. nonatomic(非原子特性),不保证线程安全  
  468.   
  469. 系统默认为atomic,但是推荐使用nonatomic  
  470.   
  471. (3)       语义特性  
  472.   
  473. assign,直接赋值,针对于基本数据类型和对象类型  
  474.   
  475. retain,针对于对象,会造成引用计数加1  
  476.   
  477. copy,针对于对象,会造成引用计数从01  
  478.   
  479. 系统默认的是assign  
  480.   
  481. category (分类,类目)  
  482.   
  483. 目的是为没有源代码的类添加方法.(只能添加方法,不能添加实例变量)是扩充一个类的功能的方式之一.为原有类扩  
  484.   
  485. 充的方法会成为原类的一部分.使用即可.  
  486.   
  487. 分类的定义格式 @interface开头 + 扩展的类名(分类名) @end结束.  
  488.   
  489. 分类也分为.h(接口部分),以及.m(实现部分) .h文件中填写方法的声明, .m文件填写方法的实现  
  490.   
  491. 延展  
  492.   
  493. 延展, 也是扩充类的功能的一种方式,只不过延展扩充的功能是私有的.是在.m文件中定义的  
  494.   
  495. 延展既可以扩展方法,也可以扩展实例变量.只不过都是私有的,外界都无法直接访问  
  496.   
  497. 延展是为有源代码的类的扩充内容  
  498.   
  499. 协议  
  500.   
  501. 1.协议,就相当于一个任务清单,规定了所要做的操作,只有一系列的方法的声明.谁服从该协议,谁就要实现协议中的  
  502.   
  503. 方法(完成任务清单).所以协议只有.h文件,没有.m文件  
  504.   
  505. 2.协议的方法有两种类型, @optional@required  
  506.   
  507. @optional 可选的,被它修饰的方法服从协议的类可以选择实现  
  508.   
  509. @required 必须的,被它修饰的方法服从协议的类必须实现  
  510.   
  511. 3.  协议命名规范: 协议依托于哪一个类,就以这个类的类名+Delegate  
  512.   
  513.    
  514.   
  515. 内存管理  
  516.   
  517. 1.内存管理基本原则:如果你对一个对象进行alloc, retaincopy之后,你就拥有了该对象的拥有权,你就必须对  
  518.   
  519. 它进行 release 和 autorelease  
  520.   
  521. 可以简单地理解为谁让引用计数+1,谁就要让引用计数-1  
  522.   
  523. 2.可以使引用计数增加的操作有:alloc, retaincopy  
  524.   
  525. 使引用计数减1的操作有release和autorelease  
  526.   
  527. 3.当该类型的对象引用计数为 0 时,系统会自动调用该类的dealloc方法回收空间.该方法是由系统自动调用,不能  
  528.   
  529. 手动调用  
  530.   
  531. 验证对象空间是否回收,只需要查看该类的dealloc方法有没有执行即可(需要在.m重写dealloc)  
  532.   
  533. 4.  属性语义声明为retaincopy时内存问题  
  534.   
  535. 当语义声明为retaincopy之后,settergetter方法内部就不是简单地赋值操作,里面解决了野指针问题和内存  
  536.   
  537. 泄露问题,还有重写dealloc方法必不可少  
  538.   
  539. 5.  便利构造器内存问题  
  540.   
  541. 如果是调用系统的便利构造器方法的话,就不需要自己去管理内存  
  542.   
  543. 如果是自己写的类,在实现便利构造器的方法的同时要加上内存处理操作,在alloc 之后,返回时使用autorelease.  
  544.   
  545. 不过,尽量不要使用便利构造器,因为它并没有是引用计数立即减1,有内存泄露的隐患  
  546.   
  547. 6.  集合内存问题  
  548.   
  549. 当把对象放进集合中(数组,字典,集合),会将对象的引用计数 +1,因为内部做了retain操作  
  550.   
  551. 当集合(数组,字典,集合)空间被回收时,他们会向集合中每一个元素都发送一个release消息  
  552.   
  553. 当从数组中移除一个元素时,会release该对象,引用计数 - 1  
  554.   
  555.                 
  556.   
  557. KVC  
  558.   
  559. 1.  KVC ,key-value-coding, 也就是键值编码  
  560.   
  561. 2.  KVC是给类的实例变量赋值或取值的一种方法  
  562.   
  563. (1).setValue:forKey:  ( 赋值)  
  564.   
  565. 其工作原理是:1.先查找该类是否有对应的setter方法:比如:setName:(set_name),如果有则通过setter方法给  
  566.   
  567. 实例变量赋值,如果没有的话,再查找该类有没有一个_+key的实例变量,比如_name,如果有,则给name赋值,如果没  
  568.   
  569. 有则再查找该类是否有一个和key同名的实例变量,比如name,如果有,则给neme赋值,如果没有,则系统会抛出一个  
  570.   
  571. NSUnknownKeyException,说明没有找到你匹配的key.(也就是该类没有setName:, 也没有_name, 和 name)  
  572.   
  573. 为了预防没有匹配的key引起程序crash,在类的.m文件中实现setValue: forUndefinedKey:  
  574.   
  575. (2).value: forKey: ( 取值 )  
  576.   
  577. 原理和setValue: forKey:类似,这个方法先判断的是getter方法  
  578.   
  579. 相对应的,这个也要在.m文件中实现  
  580.   
  581. value: forUndefinedKey:  
  582.   
  583. (3). 如果类A中有一个类B类型的实例变量a, 要通过类A给类B的实例变量b赋值则使用  
  584.   
  585. 假设A的一个对象为aa  
  586.   
  587. [aa  setValue: ForKeyPath:@”a.b”];  
  588.   
  589. (4).KVC方式用字典给对象赋值  
  590.   
  591. setValuesForKeysWithDictionary:  
  592.   
  593. 原理是:  
  594.   
  595. for (NSString *key in dic) {  
  596.   
  597.     [stusetValue:[dic objectForKey:key] forKey:key];  
  598.   
  599.  }  
  600. </span>  

抱歉!评论已关闭.