OC语言基本概念

基本概念

  • oc面向对象语言,只需关注具有相关功能的对象,不必亲力亲为。
  • oc面向对象的三大特性:封装、继承(拷贝一份父类的方法属性成员变量,方法可重写,属性成员变量不可。继承就拥有,拥有的成员变量不一定可访问)、多态(多种表现形态,代码表现为父类指针指向子类对象,运行时判断真实类型,调用子类方法)
  • 继承:继承父类的子类.m无法通过下划线直接调用父类的私有变量,需要调用self的getter方法,本质会去调用父类此变量的getter方法。若父类变量为成员变量,子类在.m中也可访问(看修饰符)
  • 源文件: .h .m .mm(oc与c++混编) ,快捷键:command + control + ↑切换.h.m。
  • 类:方法属性的集合,也是一个对象,本质是结构体
  • 对象:实例对象其地址为第0个属性isa的地址,实例对象创建时系统会自动创建类对象,其中包含当前实例对象的所有方法。继承与NSObject的对象需要内存管理,对象存放在堆。
  • 匿名对象:[Person new] (开辟存贮空间,初始化属性,返回指针地址)
  • 成员变量(属性、实例变量):写在类声明中的{}中的变量,只可通过对象访问,离开类不是成员变量。不能在定义的同时进行初始化。不可用static修饰。存贮于当前对象对应的堆的存储空间中(需手动释放)。
  • 成员变量修饰符:在类声明中{}内的即是成员变量@public:可以在其他类p-->_age、本类_age、子类_age中访问;@private可以在本类访问,不可以在其他类、子类中访问,子类不可访问即是继承即拥有父类的成员变量,拥有但是不可访问,均提示错误;@protected可以在本类、子类中访问,不可以在其他类访问;默认是此修饰符@package在当前代码所在的包中访问等于public,在其他包中访问等于private。
  • 私有变量:写在@implementation中的{}的成员变量,就是私有的成员变量,其他类无法查看访问(区别于成员变量使用@private修饰,虽然私有,但是其他类是可以可查看的。而私有变量完全私有,其它类无法通过指针p-->_age查看。由此@property生成的变量属于私有变量)
  • 局部变量:写在函数或者代码块中的变量。存贮于栈中(离开作用域系统释放),作用域至大括号或者return。
  • 全局变量:写在函数和大括号外的变量。作用域从定义的那一行至文件末尾。存储于静态区(程序启动就会分配存贮空间,直到程序结束才会释放)
  • 私有方法:只有实现,没有声明。也可调用,没有真正的私有方法(id定义类对象或performSelector)
  • 构造方法:以init开头的方法,可自定义构造方法(对象方法,instancetype,initW)。重写构造方法先初始化父类,返回子类对象地址,在设置子类属性,返回self。
  • 类工厂方法:分配初始化实例,返回一个自己实例的类方法,用于快速创建对象。(类方法,以类名称开头,首字母小写,instancetype)自定义类工厂方法是苹果的一个规范,创建对象往往有对应的自定义构造方法和自定义类工厂方法。
  • 分类:(类别,类目)不修改原类的基础上为类修改一些方法。不能扩充成员变量,而@property只会生成getter/setter方法声明,不会生成实现及私有变量。可在在分类中访问原类.h中的属性。分类方法会覆盖原有类的方法。多个分类方法覆盖原方法,会执行最后一个参与编译的分类中的方法。
  • 匿名分类:(延展类别,类扩展)为某个类扩充一些私有的属性和方法。无别名,可以扩充属性。
  • 协议:只可声明方法。@interface PersonProtocol协议遵守其它协议,就会有父协议的方法。对具有功能的对象进行限制:iddelegate;
  • 代理:设计模式是一种编码经验,使代码编制工程化。应用:当A对象想要监听B对象的变化;B对象发生一些变化,想要通知A对象;当对象B无法处理某些行为的时候,想让对象A处理,A即是B对象的代理对象。
  • 浅拷贝:不可变对象copy,不会生成新对象。
  • 深拷贝:一般是深拷贝,会生成新对象。
  • 动态数据类型:id(NSObject * 静态数据类型,万能指针),即父类指针指向子类对象,调用子类(真实类型)特有方法,通过动态数据类型调用(多态,避免强转)。也可调用真实类型的私有方法,在运行时知道对象的真实类型。调用不属于自己真实类型的方法编译时不会报错,导致运行时错误,为避免,可用iskindofclass等。
  • 野指针:对象被释放了成为僵尸对象,指向僵尸对象的指针。
  • MRC:Manul Referance Counting 引用计数retaincount为0时调用对象的dealloc方法。MRC转ARC:buildsetting- automatic r,edit convert to object arc;文件转换:targets-buildpases-compilesources(参与编译的文件顺序)--fno-object-arc。
  • ARC:Automatic Referance Counting 是编译器特性,不是运行时特性,与其他语言中的垃圾回收机制有本质区别。只要有一个强指针(默认都是强)指向对象,对象就不会释放。assign分为assign对基本数据类型,weak对对象类型,如代理delegate。
  • 点语法:是编译器的特性,会在程序翻译成二进制的时候将点语法自动换回getter/setter方法。
  • 内存泄漏:如果程序运行时一直分配内存而不及时释放无用的内存,程序占用的内存越来越大,直到把系统分配给该APP的内存消耗殚尽,程序因无内存可用导致崩溃。
  • 内存管理:MRC:一次alloc,retain 以及 copy中浅拷贝,对应一次release。深拷贝,生成新对象,系统不会对以前的对象retain,所以对新对象和原对象分别release。对象添加到数组,对象会retain,数组remove或者数组release,会对此对象release。
  • 循环引用:A对象拥有B对象,B拥有A。ARC:一边strong,一边weak。MRC:一边retain,一边assign,使用assign不需要对其拥有的此对象release。
  • 强制类型转换:实际是创建了一个新的结构体,赋值给左边。d1 = (Date){1990,1,15}结构体Date d2 = d1,修改d2不会影响d1
  • SEL:每个方法都有与之对应的SEL类型的对象,根据SEL对象就可以找到方法的地址,进而调用方法。根据对象方法名包装成为SEL类型的数据,根据此数据到该类的类对象去找相应的方法。配合对象类调用方法,判断方法是否实现。

关键字

  • @property int age;会为属性_age生成getter/setter方法的声明(xcode4.5之前,之后会自动生成声明和实现,set方法传入值默认赋值给_age),编译器指令。会生成私有变量:生成的变量在@implementation中为私有变量,无论如何修饰皆为私有。子类无法直接访问。若同时重写getter/setter方法的实现,不会自动生成私有变量。或者readonly修饰而又重写getter也不会生成。默认修饰符readwrite,assign,atomic。
  • @synthesize age = _age;实现age的set方法,把形参age赋值给_age。若不写,默认赋值给age成员变量, _age无值。在没有该私有变量情况也会生成私有变量。 在Xcode4.5及以后的版本中,可以省略@synthesize,编译器会自动帮你加上get 和 set 方法的实现,并且默认会去访问_age这个成员变量,如果找不到_age这个成员变量,会自动生成一个叫做 _age的私有成员变量。
  • @class仅仅是告诉编译器,后面是一个类。作用:减小修改低层对上层(#import预编译,拷贝一份)的影响,提高编译效率。另相互拷贝情况下,若写一个还会造成重复拷贝。所以相互拷贝的2个类都需声明。
  • @autoreleasepool 只能只要在自动释放池调用autorelease,才能将对象放入自动释放池,多个自动释放池可嵌套。
  • @dynamic是告诉编译器属性会在运行时实现getter/setter方法。

其它

  • instancetype: 在编译时可以知道真实类型,调用非自己的方法报警告。只能作为返回值。类似区别于id可以作为参数,定义数据类型,编译时不知道类型。
  • %@打印对象会调用-开头的description,返回<类名称: 对象地址>.打印类对象会调用+开头的description方法。本质打印字符串,可重写打印需要内容,其中尽量不要使用self获取成员变量,因其中再次打印self造成死循环。
  • NsLog自动换行,对C语言支持不好(char *s = "我的",#import自动防止重复拷贝,避免书写头文件卫士)
  • MRC下set方法流程:1,A对象使用B对象,对B对象进行retain,这样保证A对象存在B就存在。2,A对象释放需要对B对象进行release,防止内存泄漏,例如人对房子release。(dealloc中使用self.room = nil,对拥有的房间进行释放,防止野指针错误)3,人换房,重新赋值需要对以前的对象release,防止以前拥有的未释放。4,重复赋值导致僵尸对象及野指针retain发生错误。if(_room != room) [_room release],_room = [room retain].
  • copyWithZone会根据第一次传入的zone向上初始化,即是可以self= [super copyWithZone:zone],子类指针指向父类对象。
  • 相关视频:1.11,12,13==2.03练习2,4,13,14,15==3.4==4.16,18==5.06,07,09,11==8.15==阅读项目文档,修改项目模板,自定义快捷键,signleton单例

你可能感兴趣的:(OC语言基本概念)