关闭

黑马程序员——OC—类方法及匿名类

标签: 黑马程序员面向对象
263人阅读 评论(0) 收藏 举报

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! ———

类方法及匿名类

1、类方法概述

实例方法就是一个方法,它在类的一个具体实例的范围内执行。也就是说,在你调用一个实例方法前,你必须首先创建类的一个实例。

而类方法,比较起来,也就是说,不需要你创建一个实例。

+表示类方法,就是类调用方法,不依赖于任何对象的方法。

-表示是实例(对象)方法,只能是对象可调用,依赖与于何对象的方法。



2、类方法的调用

[类名称  类方法名称];


3、类方法使用注意事项:

1)类方法可以和实例方法同名,这个并不影响使用,实例方法由实例对象访问调用,类方法要通过类来访问调用,不会有交叉相互影响。




2)类方法也可以是从父类继承而来,子类可以重写类方法,如description类方法就可以在子类里重新定义这个方法。

3)类方法和实例方法一样在interface里声明,在implementation里实现。

4)类方法智能被向类发送类方法消息才被执行,向实例对象发送类方法是不能被触发执行的。

5)在类方法里使用了self,这个self执行的类对象class Object而不是实例对象instance Object。


4、类方法的优点

1)节省内存空间

2)提高了效率

3)作为工具方法


5、类方法的易犯错误


1)在类方法中使用了类的成员变量



6、类方法与对象方法比较


1)对象方法:

以-号开头

可以使用成员变量

用对象调用对象方法

对象方法可以调用当前对象或者其他对象的方法(是通过将对象作为参数传入方法)如下


调用当前对象的其他方法:


调用其他对象的方法



对象方法可以调用类方法



2)类方法

以+开头

不可以使用成员变量

用类名调用类方法



类方法可以调用对象方法(是通过将对象作为参数传入方法)和类方法


类方法不可以调用自身,会造成死循环



同名方法的区别:

通过同名方法前面的+ - 号区分



7、OC类方法应用场景

如果我们调用一个方法,该方法中不需要使用成员变量,那么我们可以将该方法声明为类方法

@interface  Calculator :NSObject

{

    int _result;

    int _num1;

    int _num2;

}

//声明一个类方法用于计算两个数的和

+(int )sumNum1:(int )num1  andNum2:(int )num2;

@end


@implementation Calculator

 //通过类方法计算两个数的和

+(int )sumNum1: (int )num1  andNum2:(int )num2  {

   return num1 + num2;

}

@end


8、匿名类的概念


定义如下类:

#pragma mark 车类的声明

@interface Car :NSObject

{

   @public

   int  _color;

}

- (void)run;  //车启动

- (void)stop; //车停止

@end

#pragma mark 车类的实现

@implementation Car

//车启动

- (void)run{

NSLog(@“Car Start! color:%d”, _color);

}

//车停止

- (void)stop{

NSLog(@“Car Stop!”);

}


#pragma  mark  人类的声明

@interface Person :NSObject

{

NSString * _name ;

int _age;

}

//人开车回家

- (void)goHome:(Car *)car;

@end

#pragma mark  人类的实现

@implementation Person

- (void)goHome:(Car *)car{

//车启动了

[car run];

}

@end


9、匿名类访问变量


发现虽然我们给_color进行赋值了,但是打印出来以后还是0,

原因如下:


10、匿名类调用方法


11、匿名类作为方法的参数

1)匿名类作为方法的参数


2)匿名类优缺点

优点:可以简化代码,方便方法调用

缺点:匿名对象实例化以后,只能正确的使用成员变量一次

常见用法:

//下面两句的作用是等价的

Person *p = [[Person alloc] init];

Person *p1 = [Person new];

两者的区别:

alloc 和 init 分别把分配内存和初始化的工作分开。这样更加的灵活,可以自行初始化对象的成员变量值

而不像new每次都初始化为0

new是把分配内存和初始化的工作一起完成了,先分配内存,然后调用类的构造函数。




0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3917次
    • 积分:134
    • 等级:
    • 排名:千里之外
    • 原创:10篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章分类
    文章存档
    最新评论