OC重学第二天

一. 类方法

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

二 .关键字static

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

  • 修饰函数

  • OC中的static 关键字

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

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

举例说明

#include
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] 
2017-05-24 15:55:16.987 test[1262:161401] 我是父亲
2017-05-24 15:55:16.987 test[1262:161401] 
2017-05-24 15:55:16.987 test[1262:161401] 只是儿子

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

OC重学第二天_第1张图片
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重学第二天)