OC重学第二天

一. 类方法

  1. OC 中方法分为两种.
    • 对象方法/实例方法
      如果想要调用对象方法必须要创建对象,通过对象来调用
    • 类方法.
      类方法的调用不依赖于对象.如果要调用类方法 不需要去创建对象.而是直接通过类名来调用.
  • 声明.
    • 对象方法的声明:
      对象方法声明使用 - 号
      - (返回值类型)方法名;
      - (void)sayHi;
    • 类方法的声明:
      类方法声明使用 + 号.
      + (返回值类型)方法名;
  • 调用.
    • 对象方法: 先创建对象,再通过对象名来调用.
    • 类方法: 不需要通过对象名调用, 所以如果调用类方法不需要创建对象.而是直接使用类名来调用[类名 类方法]
  • 类方法和对象方法的调用过程.
    类方法的特点
    * 节约空间: 因为调用类方法不需要创建对象.这样就节约了空间.
    * 提高效率: 因为调用类方法不需要拐弯 直接找到类 直接执行类中的类方法.
  • 在类方法中不能直接访问属性
    属性是在对象创建的时候.跟随着对象一起 创建在对象之中.
    类第一次被访问的时候,会做类加载.是把类的代码存储在代码段
    因为属性只有在对象创建的时候才会创建在对象之中.
    而类方法在执行的时候.有可能还没有对象,对象没有,怎么可能会访问属性呢
    虽然不能直接访问属性.但是我们可以在类方法中创建一个对象访问这个对象的属性
  • 在类方法中也不能通过self直接调用当前类的其他对象方法
    因为对象方法只能通过对象来调用 而这个时候没有对象
  • 在对象方法中可以直接调用类方法
  • 什么时候我们可以将方法定义为类方法?
    如果方法不需要直接访问属性 也不需要直接调用其他的对象方法.那么我们就可可以使用类犯法 节约空间 提高效率

二 .关键字static

  1. C语言中的static.
  • 修饰局部变量
  • 修饰全局变变量

  • 修饰函数

  • OC中的static 关键字

  • static 不能修饰属性 也不能修饰方法
  • static 可以修饰方法中的局部变量
    • 如果方法中的局部变量被static修饰,那么这个变辆就会被变成静态变量.存储在常量区 当方法执行完毕之后 不会被回收 下次再执行这个方法的时候 直接使用 而且不会再声明.

<blockquote>准确的说静态变量的类型关键字是static.静态变量属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量,例如外部变量属于静态存储方式,但不一定是静态变量,必须由static加以定义后才能成为静态外部变量,或称静态全局变量,对于自动变量,它属于动态存储方式.但是也可以用static 定义为静态自动变量,或称静态局部变量,从而成为静态存储方式.由此看来,一个变量可由static进行说明,并改变其原有的存储方式
</blockquote>

举例说明

#include<stdio.h>
int fun(int n)
{
    static int f=1;
    f=f*n;
    return f;
}
void main()
{
    int i;
    for(i=1;i<=5;i++)
    printf("fun(%d)=%d\n",i,fun(i));
}

这里的运行结果是:

fun(1)=1
fun(2)=2
fun(3)=6
fun(4)=24
fun(5)=120

说明f 在static 的类型限制之后,就相当于全局变量,函数调用完了之后,修改过的f的值任然有效.而如果不加static的类型限制.输出结果如下

fun(1)=1
fun(2)=2
fun(3)=3
fun(4)=4
fun(5)=5

三 . self 和 super关键字

@implementation Boy : Person
 - (id)init{

    self = [super init];
    if (self){
    }
    return self;
}

额 .... 这不就是 初始化的方法吗,子类实现初始化前调用父类的init方法.但不明白啊 , 为什么要这么写 ,我只知道规定是这么写 ,具体原因也是一知半解, 没办法 只能查资料了 .

self 和 super 代表着什么 ?

1 . self 的含义

   在动态方法中:self代表中对象;
   在静态方法中:self代表着类;
   有点意思,也就是说:self是一个指针.在对象方法中self指向当前对象.在类方法中self 指向当前类
  • 注意
    • 对象方法中,self代表当前对象
      所以可以通过self访问当前对象的成员.
      在对象方法中 不能使用self调用本类的类方法
    • 在类方法中,self代表当前这个类
      所以,可以通过self调用当前类的其他类方法
      在类方法中 不能使用self访问对象的成员.不能去直
      接方法属性和对象方法

2 . super 的含义

在OC 对象中的关键字super是用来直接调用父类中的某个方法用的.一般用来子类重写父类的方法时,想要保留父类的一些行为,减少代码重复,所以就用super关键字来调用父类现成方法.当super处于对象方法中,调用的是父类同名的对象方法;当super出在类方法中时,调用的是父类同名的类方法

总的来说,self是类的隐藏的参数变量,指向当前调用方法的对象,另一个隐藏参数是_cmd,代表当前类方法的selector .super并并不是隐藏的参数,它只是一个'编译器指示符'

self = [super init]做了什么

  • 首先 我写了个继承的类
 - (id)init{
    self = [super init];
    if (self) {
        NSLog(@"%@", self);
        NSLog(@"我是父亲");
    }
    return self;
}
 - (id)init {
    self = [super init];
    if (self) {
        NSLog(@"%@", self);
        NSLog(@"只是儿子");
    }
    return self;
}

当初始化子类 Son 的时候打印的结果是

2017-05-24 15:55:16.987 test[1262:161401] <Son: 0x600000002e00>
2017-05-24 15:55:16.987 test[1262:161401] 我是父亲
2017-05-24 15:55:16.987 test[1262:161401] <Son: 0x600000002e00>
2017-05-24 15:55:16.987 test[1262:161401] 只是儿子

看到上面的结果,父类此时的方法调用者依然是子类Son,父类竟然成了子类的一部分,在实例化子类时父类实例化self是不存在,所以还是子类只不过包含了父类.引用网上的图片

Alt text

补充说明

说了这么多 ,总算是明白了,但忽然 又查质料的时候发现大神写的比我的清晰,我之前写的是以自己的理解做的简单的测试 , 大神的地址是:传送门http://blog.csdn.net/aoyuehan11/article/details/10268231

参考

http://blog.csdn.net/aoyuehan11/article/details/10268231
http://www.cnblogs.com/breezemist/p/5477288.html
http://www.jianshu.com/p/24be15c6c7f2

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

推荐阅读更多精彩内容