OC基础——OC总结



1、消息机制:以[p run]为例
1> 告诉P所指向的对象之行run消息;
2> 对象会沿着内部的ISA指针指向的类,在类里面寻找run方法;
3> 当在类中找到此方法时,就调用此方法

2、方法与函数的区别
(1)对象方法都是减号-开头,方法必须是对象调用、(通过对象调用方法)
(2)对象方法只能由对象来调用,对象方法归类对象所有。
         1>方法声明写在@interface 和 @end之间
         2>方法实现写在@implementation和@end之间
 (3)函数跟对象无关系(函数不依赖对象),跟类没有任何联系,函数归整个程序文件所有。
 (4)函数不能访问OC对象成员。
 (5)函数可以写在文件的任何位置,但是不能写在@interface和@end之间。

3、对象方法和类方法
对象方法:1> 减号“-”开头;
                 2> 只能由对象来调用;
                 3> 对象方法中能访问当前对象的额成员变量。
类方法: 1> 以加号”+“开头;
               2> 只能由类来调用;
               3> 类方法中不能访问成员变量。

4、self与super
1> self是一个指针,指向调用当前方法的对象,即方法调用者。谁调用了方法,self就指向谁。看self所处的当前环境:
      self出现在对象方法中,self就代表对象;
      self出现在类方法中,self就代表类。
2> super可以直接调用父类中的方法;
      super处在对象方法中,就会调用父类的对象方法;
      super处在类方法中,就会调用父类中的类方法。
      使用场合:子类重写父类的方法时想保留父类的一些行为。

5、创建OC字符串的方法
1> NNString *str = @"itcoast";// oc字符串以@开头
2> NNString *str = [NSString stringWithFomat:@"my age is %d,number is %d",age,no];
长度算法:[str length]// 直接调用NSObject中的length方法,length方法计算的是字数(包括空格),并不是字符数。

6、成员变量作用域
1> @public 全局都可以访问,任何地方都可以直接访问。
2> @protected 只能在当前类和子类的实现@implemetation中直接访问。
3> @private 只能在当前类的实现@implemetation中直接访问。
4> @package:在同一框架中可以访问,介于@private和@public之间。
注意:
1> 写在方法申明中(即@interface中)的成员变量,如果什么都不写默认情况下为protected类型。
2> 写在方法实现中(即@implemetation中)的变量,默认情况下为私有的provite类型。

7、@property与@synthesize
1> @property:写在@interface中,可以自动生成某个成员变量的setter和getter方法的声明。
2> @synthesize:写在@implementation中,可以自动生成某个成员变量的setter和getter方法的实现。
其实@property既可以生成get和set方法的声明也可以生成set和get方法的实现。

8、自定义构造方法的规范
1> 一定是对象方法,一定以“-”开头;
2> 返回值一般是id类型;
3> 方法名一般以initWith开头。
4> 先调用父类的构造方法[super init],再进行子类内部成员变量的初始化。
eg:
<span style="font-family:Microsoft YaHei;font-size:14px;">-(id)initWithName:(NSString *)name
{
    if(self = [super init])
    {
       _name = name; 
    }
    return self;        
}</span>
9、new方法和alloc、init方法区别
  new 是分两步来生成对象的
      1> 调用+alloc 方法来给对象分配内存空间
      2>调用-init 方法给对象的成员变量初始化成默认的值
缺点:不能在创建对象的同时进行一些必要的初始化值
  alloc、init方法
优点:可以在对象初始化时,使成员变量拥有必要的初始化值

10、+load和+initialize

1、类的加载(+load)
1> 加载顺序:父类—>子类
2> 在程序启动的时候会加载所有的类和分类,并调用所有类和分类的+load方法。
3> +(void)load;//程序一启动的时候,就只调用一次此方法,+load方法存在于NSObject中。

2、类的初始化(+initialize)
1> 加载顺序:父类—>子类
2> 当第一次使用某个类的时候,就会调用一次+initialize方法,用到的时候才会调用initialize方法,不用的时候不会调用,一个类只会调用一次+initialize方法,而且若调用了子类,父类也会调用一次+initialize方法。
3> +(void)initialize; // 当初始化类时,就会调用此方法,此方法是存在于NSObject。    

11、引用计数器每个对象都有一个引用计数器,是一个整数,占4个字节,用于计算对象被引用的次数,即有多少人在使用当前对象。当引用计数器值为0时,表示无人在用,对象所占用的内存会被系统回收,从内存中移除。只要计数器不为0,对象就不会被回收,除非整个程序已经退出。当产生一个新对象时,对象的引用计数器默认是1。

12、@class与#import的区别
      1)#import方式会包含被引用类的所有信息,包括被引用类的变量和方法; @class方式只是告诉编译器在A.h文件中的B类只是一个类,具体这个类有什么信息,这里不需要知道,等文件中真正要用到的时候,才会去查看B类中的信息。
      2)如果有上百个头文件都#import了同一个文件,或者这些文件依次被#improt,那么一旦最开始的头文件稍有改动,后面引用到这个文件的所有类都需要重新编译一遍,降低效率。(A->B B->C C->D……,一旦A变动,则后面都需要重新编译)。
      3)在.m实现文件中,如果需要引用到被引用类的实体变量或者方法时,还需要使用#import方式引入被引用类。

13、循环retain
概念:比如A对象retain了B对象,B对象retain了A对象,这样会导致A对象和B对象永远无法释放。
解决方案:当两端相互引用时,应该一端用retain、一端用assign。
14、autorelease的优缺点:
优点:不用再关心对象的释放时间,即不用关心什么时候调用autorelease。
缺点:不能精确的控制内存销毁的时间。所以尽量用release,便于精确控制。
注意:@autoreleasepool
{
     Person *p = [[[Person alloc]init]autorelease]auturelease;

注意:以上代码会发生野指针错误,写两次autorelease意味着当池子销毁时,会对对象做两次release操作。所以不能写两次autorelease。
15、ARC循环引用的解决方案
一端用strong,一端用week(非ARC:一端用retain,一端用assign)

16、block与函数
1>相同点:(1)都可以保存代码;
                 (2)都有返回值;
                 (3)都有形参;
                 (4)调用方式一样。eg: myblock(10,12);
2>不同点:(1)block的标识符是^,而函数没有;
                 (2)block默认情况下不能修改局部变量,而函数在默认情况下可以修改成员变量。
                 (3)在block情况下,当语句结束时,需要在大括号外部添加分号;,而函数不需要。

17、常用的结构体
    NSRange:表示范围。
    NSPoint/CGPoint:表示点位置
    NSSize/CGSize:表示UI的尺寸大小
    NSRect/CGRect:表示UI的位置和尺寸大小

18、常用的类以及集合
   常用类:NSString/NSMutableString
   集合:NSArry/NSMutabArry(有序)、NSSet/NSMutableSet、NSDictonary/NSMutableDictonary、NSDate、NSObject

19、NSValue与NSNumber的区别
    1>NSNumber是NSValue的子类。
    2>NSNumber只能包装基本数据类型,而NSValue可以包装任意类型,例如字符、数组、结构体等。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值