OC重学第三天

通过上篇文章,我学习了OC 的几个比较容易混淆的关键字,在讨论 self= [super init] 的方法的时候,想到了还涉及到SEL 所以开篇第一个就学习一下SEL ,不过今天主要学的是OC 特有语法

一 . SEL

1 . SEL 全称叫做 selector 选择器

  SEL 是一个数据类型,所以要在内存中申请空间存储数据.
  SEL 其实是一个类 SEL 对象是用来存储1个方法的
  可以理解@selector(),方法选择器.于是乎就可说是C 中的指针函数.而在OC里不能用指针函数,所有就只能搞一个@selector 来去了
  他的结果的SEL类型,用assgin修饰.去取方法的编号(函数地址)

2. 类是以Class对象的形式存储在代码段中.

 还要将方法存储的 类对象之中,怎么江方法存储在类对象中.
 1. 先创建一个SEL 对象.
 2. 将方法的信息存储在这个SEL对象之中
 3. 再将这个SEL对象作为类对象的属性

3. 拿到存储方法的SEL对象

  1. 因为SEL是一个typedef类型的 在自定义的时候已经加*了.所以我们在声明SEL 指针的时候 不需要加 * 
  2. 取到存储方法的SEL 对象
     SEL S = @selector(方法名)

4. 调用方法的本质

[s sayHi];
内部的原理
 1. 先拿到存储sayHi方法的SEL对象,也就是拿到存储sayHi方法的SEL 数据.SEL消息
 2. 将这个SEL消息发送给 s对象
 3. 这个时候,s对象接收到这个SEL消息以后 就知道要调用方法
 4. 根据对象的ISA指针找到存储类的类对象
 5. 找到这个类对象以后 在这个类对象中去搜寻是否有传入的SEL数据相匹配的 如果有 就执行 , 如果没有再找父类 直到NSObject .

5 . 手动为对象发送SEL消息

  1. 先得到方法的SEL数据
  2. 将这个SEL消息发送给s对象
     调用对象的方法 将SEL 数据发送给对象
     - (id)performSelector:(SEL)aSelector;
     Person *p1 = [Person new];
     SEL s1 = @selector(sayHi);
     [p1 performSelector:s1]; 与 [p1 sayHi]效果是完全一样的.

 3. 调用1个对象的方法有两种.
   1. [对象名 方法名];
   2. 手动的为对象发送SEL消息.

其实这个调用的本质 就是 消息机制
我也是查看了大神的blog 才慢慢的对消息机制有了一点认知 话不多说 好文章当让与 火友 一起分享 <a href="http://yulingtianxia.com/blog/2014/11/05/objective-c-runtime/" target-"_blank">火之叶</a>

二 . 点语法

1 . Java C# 对象可以使用点语法来访问对象的成员变量

OC中也有点语法. OC 中也可以使用点语法来访问对象的属性.但是OC的点语法和Java C#是完全不一样的
OC 的对象如果要为属性赋值或者取值 就要滴啊用对应的getter 或者 setter

2. 使用点语法来访问对象的属性

语法
   对象名.去掉下划线的属性名;
   这个时候就会将@"火之叶"赋值给p1对象的_name属性
   p1.name = @"火之叶";
   NSString *name = p1.name; 把p1对象的_name 属性的值取出来
   ```
##3. 点语法的原理
    1). 当使用点语法赋值的时候. 这个时候编译器会将点语法转换为调用setter方法的代码.

      对象名.去掉下划线的属性名 = 数据;
      转换为:
      [对象名 set去掉下划线的属性名首字母大写:数据];
      p1.age = 10;
      [p1 setAge:10];


  2).当使用点语法取值的时候.这个时候编译器会将点语法转换为调用getter方法的代码.
      对象名.去掉下划线的属性名;
      转换为:
      [对象名 去掉下划线的属性名];
      int age = p1.age;
      int age = [p1 age];


##  4.注意.

  1). 在getter和setter中慎用点语法,因为有可能会造成无限递归 而程序崩溃,
  2). 点语法在编译器编译的时候 会转换为调用setter getter方法的代码.
      p1.name = @"jack";
      [p1 setName:@"jack";
      NSString *name = p1.name;
      NSString *name = [p1 name];
      如果我们的setter方法和getter方法名不符合规范 那么点语法就会出问题.
  3). 如果属性没有封装getter setter 是无法使用点语法的 
      因为点语法的本质是getter setter方法.

#三 .  统一的介绍
## 1. @property
   Xcode4.4之前
   @property: 只生成getter、setter方法的声明.
   @synthesize: 生成私有属性.并生成getter、setter方法的实现.
   Xcode4.4开始.
   @property增强: 
   1). 自动生成私有属性.
   2). 自动生成私有属性的getter setter方法的声明和实现.

##2. 编译检查与运行检查
   编译检查: 
   通过1个指针去访问对象的成员的时候,编译判断可以不可以的准则: 指针的类型当中是否有这个成员.
   运行检查:
   在程序运行的时候,通过1个指针去访问对象的成员之前,还会检查指针所指向的对象中是否真的有这个成员.


##3. 万能指针(NSObject、id). instancetype
   NSObject和id 它们都是万能指针,可以指向任意的OC对象.
   NSObject指针访问对象的成员的时候,编译器会做编译检查.
   id指针调用指针指向的对象的方法的时候.编译器不做任何检查 直接通过.
   id指针的缺点: 不能使用->访问属性 也不能使用点语法.
   instancetype: 只能做为方法的返回值.代表返回当前类的对象.


##4. 动态类型检测 反射
   1). 判断指针指向的对象中 指定的方法是是否可以调用.
   2). 判断类方法是否可以调用.
   3). 判断对象是否为指定类的对象或者子类对象.
   4). 判断对象是否为指定类的对象.
   5). 判断指定的类是否为另外1个类的子类.

##  5. 构造方法.
   1). new是1个类方法. 创建对象初始化对象返回对象.
   2). new方法的内部其实就是 alloc init
   3). init方法就叫做构造方法. 初始化对象
   4). 重写init构造方法.     
   5). 自定义构造方法.
  如果你想要调用init默认的构造方法.那么new可以. 也可以使用alloc init
  如果你像要调用自定义的构造方法.这个时候就必须先alloc 再调用自定义的init
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容

  • OC基础总结 重新回过头看这些基础知识,对许多知识点都有新的认识,拥有坚实的基础才能更快的成长。 #improt ...
    xx_cc阅读 6,004评论 10 56
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,670评论 0 9
  • 1. 使用 #import 相对c的 include 是防止头文件的重复导入 2. NSLog 相对于 print...
    迎风起飞的猪阅读 1,693评论 6 9
  • 视觉思维整理法就如同我们学习英语一样,1、视觉单元,就是小图画,如同“单词”;2、视觉单元组就是将视觉单元...
    咩一阅读 623评论 0 0
  • 一只蜗牛 我家住三楼,有台阶53级,一只蜗牛爬到了我家门口。 我发现它的时候,它是静止的,仿佛定在了墙上,我临出门...
    那一轮月阅读 260评论 0 0