OC基础笔记2

来源:互联网 发布:犀牛软件破解码 编辑:程序博客网 时间:2024/04/30 07:23
25,在.h文件中定义的成员变量能直接被别人看到,如果不想被看到,可以定义在.m文件的实现中,成为私有变量,并且只能自己调用(本类使用)。写法和常规定义一样。
定义一个私有方法,是不被声明的方法,不能被直接调用,需要id类型的指针,和消息选择器等间接调用。
26,@property也是编译器指令,在编译时自动生成seigei方法的声明,基本写法:@property int age;    
27,@synthesize则在编译时自动生成seigei方法的实现,基本写法: @synthesize age =_age   赋值以及返回的都是等号后面的属性。如果等号后面没有写,那么默认是返回和赋值它本身
28,4.4系统之后的xcode,可以只用@property就可以同时声明和实现,还可以自动生成相应的实例变量(生成的是私有属性)。想要改setget方法,重写就可以了。若两个方法都重写,那么就不会自动生成私有属性,等同@property失效。
29,@property的修饰符,修饰属性可读可写,非线性等特性,有readonly,readwrite(默认),如果要改自动生成的getset的方法名称,可以加上(getter/setter=xxx)做为其中一个修饰符。常用的特例:BOOL类型如果要改get方法的名称,要在新名称前加上is:(getter=isxxx)
30,动态数据类型id类型,在编译时才知道它指的是谁。(静态类型是数据有指定(所属)类型的),动态类型常用于多态方法的优化。在方法中id类型的形参可以传递任何类型的类,只要传递了谁源类型就被它所代替。虽然NSObjec也可以接收任何对象,但却不会被代替,属于静态的。实现:一个方法,多个类使用。
31,动态类型还可以直接调用私有方法(没有声明的方法),而且可能调用到不属于自己的方法(在项目范围内),编译时又不报错。可以用if来先判断是否含有此方法,再调用 isKindOfClass:[xxx  class] 来 检查id类型对象是否是含那个方法的类或者子类,或者用 isMemberOfClass:[xxx class] 是否是含那个方法的类的实例对象。如果是,那么就属于拥有这个方法,编译通过。
33,类新建的对象都等同一个结构体,所以id类型也是一个结构体类型
34,id类型所创建的对象,在赋值属性时不要用点语法,因为点语法是编译特性,而id是运行时的特性,程序是先编译后运行,而点语法是在创建对象之后才用到,顺序不对会运行出错。
35,在新建一个对象时,系统会根据代码区的内容先在堆中创建一个类对象,调用new中包含的+allco方法,分配一个堆内存建立一个含有 isa变量 的对象,通过isa指向类对象,来获取实例并将所有实例变量的值设置为零, 最后返回此对象的内存地址,用一个局部变量(只能放在栈中)去接收这个地址,在栈中保存起来备用。
35,类对象是一种数据结构,储存类的基本信息:类的大小、名称、版本、继承层次、消息(方法),函数的映射表等。实例是由类对象生成的。
36,没有修改init方法 (没有进行设置初始化的值时),init方法为空,所以初始化默认为零,也默认返回self的地址。init是一个专用于赋值的方法
37,构造方法,使调用者在初始化的时候直接拥有一些属性或值,通常在需要新建对象时使用,例如init方法
38,构造方法有苹果规定的写法,要先成功初始化父类[super init]并返回地址给自己self,才能用这个返回的地址去初始化子类的属性(调用者本身)......,最后return self这个地址,就能调用设置改的子类的初始化了
39,每次初始化时都会调用父类的初始化,因为这样子类才能拥有父类的属性。但如果父类已经有了初始化的设定,那么子类不改动的话就会继续沿用。(用自定义方法改善)
40,instancetype也是万能指针,5.5之后的系统init方法的返回值类型主要用它而不是id。当返回的地址被接收时,在编译时就检查新建对象的真实类型和接收者的类型是否一致,在运行之前就能知道对错,方便调整。但它只能用在返回值类型,不像id那么多功用。
41,自定义构造方法:以init开头的带有属性形参的方法,对象调用时直接初始化其中的属性age。可以多个构造,也可以多个参数,相对灵活。
 42,子类初始化时,如果同时需要初始化父类的属性以及自己的属性,也可以通过super调用父类的自定义构造方法来初始化,减少重复写代码
43,new也称为类工厂方法,类工厂方法用于快速创建对象的类方法,以类名为方法名的开头,返回值也是id或instancetype,内部也就是创建对象的方法,返回的是新对象和地址,和new差不多,把创建对象以及初始化的一整套方法都封装了起来,节省代码。
44,也就是一般情况下,可以用new,自定义构造allco和init,类工厂,这三种来创建对象。都是苹果的规范方法,通用的。
45,自定义类工厂方法时,内容要尽量使用self,以防止子类继承并调用时出现语法错误,子类用来接收父类的对象就很容易出错。
46,类的本质:每一个实例对象Instance of Subclass都有一个isa指针,而类对象class的isa指向它的元类对象meta,存着所有对象方法,而元类对象也有isa指针,指向它的根元类对象Root (meta),放能创建对象的方法以及类方法, 而它的isa是指着自己的。创建对象的顺序:代码区,类对象,元类对象,根元类对象。NSObject就是根元类对象
47,类方法是在元类对象中存放,由类对象拿来调用;而对象方法是在类对象中存放,由实例对象拿来调用。而实例对象要先创建才能调用方法,而类对象一开始就自动生成,所以对象方法耗性能一些。
48,一个类对象有父类,那么类对象的元类对象就是其父类的元类对象的子类。
49,类的启动过程:加载代码到内存,同时调用类方法load启动,再用类方法initialize用来创建类对象(可以顺便批量初始化),都是只调用一次。
50,每次建立新对象时,都是先创建父类的类对象,除了NSObject。
0 0