美文网首页
OC重学第二天

OC重学第二天

作者: 火之夜工作室 | 来源:发表于2017-05-23 19:24 被阅读7次

一. 类方法

  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

相关文章

  • OC重学第二天

    一. 类方法 OC 中方法分为两种.对象方法/实例方法如果想要调用对象方法必须要创建对象,通过对象来调用类方法.类...

  • OC重学第三天

    通过上篇文章,我学习了OC 的几个比较容易混淆的关键字,在讨论 self= [super init] 的方法的时候...

  • OC重学第一天

    一 . Objective-C基础语法 二. OC 与 C 的对比 三 . 类与对象 1 . 类与对象的区分 2 ...

  • iOS重学之探究OC对象的本质

    写在前面 苹果官方源码下载:opensource.apple.com/tarballs -> 搜索objc/4 -...

  • 重学iOS——1.从C角度看OC

    面向对象 面向对象的编程思维,简而言之就是:一切皆对象。面向对象的语言区别于C语言(面向过程),C语言是按照代码的...

  • 感受英国的教育

    英国的教育注重学生自主的发展,注重学生兴趣的培养,注重学生实际能力的锻炼。为此学校教育的各个环节都注...

  • 【0529读书笔记】3037―史玲玲

    读书感悟第二天打卡,读了九章(47页) 书名:《你只是看起来很努力》 作者:李尚龙 金句:别只注重学习方法,而忘了...

  • 知识分子学佛的通病

    能知不能行 重学理不重实证

  • 《燕子》,给了我当头棒喝!

    今天是学习治疗师课程培训的第二天。今天着重学习的是学习系统中的价值决策与程序定制,很多全新的概念与名词,需要与我的...

  • 重学iOS系列之底层基础(一)OC对象的本质

    导读 在开发过程中,是否有疑惑过,我们创建的OC对象本质到底是什么?实例对象在内存中是怎么存储的?对象在程...

网友评论

      本文标题:OC重学第二天

      本文链接:https://www.haomeiwen.com/subject/lfsgxxtx.html