OC重学第二天

2017-05-23  本文已影响7人  火之夜工作室

一. 类方法

  1. OC 中方法分为两种.
    • 对象方法/实例方法
      如果想要调用对象方法必须要创建对象,通过对象来调用
    • 类方法.
      类方法的调用不依赖于对象.如果要调用类方法 不需要去创建对象.而是直接通过类名来调用.

二 .关键字static

  1. C语言中的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 指向当前类

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

上一篇 下一篇

猜你喜欢

热点阅读