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与super1> self是一个指针,指向调用当前方法的对象,即方法调用者。谁调用了方法,self就指向谁。看self所处的当前环境:self出现在对象方法中,self就代表对象;self出现在类方法中,self就代表类。2> super可以直接调用父类中的方法;super处在对象方法中,就会调用父类的对象方法;super处在类方法中,就会调用父类中的类方法。使用场合:子类重写父类的方法时想保留父类的一些行为。
6、成员变量作用域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方法计算的是字数(包括空格),并不是字符数。
1> @public 全局都可以访问,任何地方都可以直接访问。
2> @protected 只能在当前类和子类的实现@implemetation中直接访问。
3> @private 只能在当前类的实现@implemetation中直接访问。
4> @package:在同一框架中可以访问,介于@private和@public之间。
注意:
1> 写在方法申明中(即@interface中)的成员变量,如果什么都不写默认情况下为protected类型。
2> 写在方法实现中(即@implemetation中)的变量,默认情况下为私有的provite类型。
7、@property与@synthesize1> @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)
11、引用计数器:每个对象都有一个引用计数器,是一个整数,占4个字节,用于计算对象被引用的次数,即有多少人在使用当前对象。当引用计数器值为0时,表示无人在用,对象所占用的内存会被系统回收,从内存中移除。只要计数器不为0,对象就不会被回收,除非整个程序已经退出。当产生一个新对象时,对象的引用计数器默认是1。
1> 加载顺序:父类—>子类
2> 当第一次使用某个类的时候,就会调用一次+initialize方法,用到的时候才会调用initialize方法,不用的时候不会调用,一个类只会调用一次+initialize方法,而且若调用了子类,父类也会调用一次+initialize方法。
3> +(void)initialize; // 当初始化类时,就会调用此方法,此方法是存在于NSObject。
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可以包装任意类型,例如字符、数组、结构体等。