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<NSObject>协议遵守其它协议,就会有父协议的方法。对具有功能的对象进行限制:id<PersonProtocol>delegate;
  • 代理:设计模式是一种编码经验,使代码编制工程化。应用:当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单例
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容