一. 类方法
- OC 中方法分为两种.
- 对象方法/实例方法
如果想要调用对象方法必须要创建对象,通过对象来调用 - 类方法.
类方法的调用不依赖于对象.如果要调用类方法 不需要去创建对象.而是直接通过类名来调用.
- 对象方法/实例方法
- 声明.
- 对象方法的声明:
对象方法声明使用 - 号
- (返回值类型)方法名;
- (void)sayHi; - 类方法的声明:
类方法声明使用 + 号.
+ (返回值类型)方法名;
- 对象方法的声明:
- 调用.
- 对象方法: 先创建对象,再通过对象名来调用.
- 类方法: 不需要通过对象名调用, 所以如果调用类方法不需要创建对象.而是直接使用类名来调用[类名 类方法]
- 类方法和对象方法的调用过程.
类方法的特点
* 节约空间: 因为调用类方法不需要创建对象.这样就节约了空间.
* 提高效率: 因为调用类方法不需要拐弯 直接找到类 直接执行类中的类方法. - 在类方法中不能直接访问属性
属性是在对象创建的时候.跟随着对象一起 创建在对象之中.
类第一次被访问的时候,会做类加载.是把类的代码存储在代码段
因为属性只有在对象创建的时候才会创建在对象之中.
而类方法在执行的时候.有可能还没有对象,对象没有,怎么可能会访问属性呢
虽然不能直接访问属性.但是我们可以在类方法中创建一个对象访问这个对象的属性 - 在类方法中也不能通过self直接调用当前类的其他对象方法
因为对象方法只能通过对象来调用 而这个时候没有对象 - 在对象方法中可以直接调用类方法
- 什么时候我们可以将方法定义为类方法?
如果方法不需要直接访问属性 也不需要直接调用其他的对象方法.那么我们就可可以使用类犯法 节约空间 提高效率
二 .关键字static
- 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访问对象的成员.不能去直
接方法属性和对象方法
- 对象方法中,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是不存在,所以还是子类只不过包含了父类.引用网上的图片
补充说明
说了这么多 ,总算是明白了,但忽然 又查质料的时候发现大神写的比我的清晰,我之前写的是以自己的理解做的简单的测试 , 大神的地址是:传送门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