标签:
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -----
第一讲 类方法学习引入
本小节知识点:
1、【了解】类方法学习思考
2、【了解】实现OC版计算器
思考&实现1:
设计一个“计算器(Calculator)”类
1)实现两个书的 + - * / 的计算
思考:
首先创建一个类
类名:Calculator
属性:第一个数 num1 第二个数 num2 运算结果 result
1 #import <Foundation/Foundation.h>
2 //第一种方法
3 @interface Caculator : NSObject
4 {
5 @public
6 //定义实例变量
7 int _num1;
8 int _num2;
9 float _result;
10 }
11 //四个方法
12 -(void)add;
13 -(void)jian;
14 -(void)cheng;
15 -(void)chu;
16 @end
17 #import "Caculator.h"
18
19 @implementation Caculator
20 -(void)add{
21 _result = _num1 +_num2;
22
23 }
24 -(void)jian{
25 _result = _num1 -_num2;
26 }
27 -(void)cheng{
28
29 _result = _num1 *_num2;
30 }
31 -(void)chu{
32
33 _result = _num1 /(float)_num2;
34 }
35 @end
36
37 //第二种方法 声明类
38 @interface Calculator2 : NSObject
39 //四个方法
40 -(int)add:(int) num1 andNum2:(int) num2;
41 -(int )jian:(int) num1 andNum2:(int) num2;
42 -(int)cheng:(int) num1 andNum2:(int) num2;
43 -(float)chu:(int) num1 andNum2:(int) num2;
44 @end
45
46 #import "Calculator2.h"
47
48 @implementation Calculator2
49 //四个方法
50 -(int)add:(int) num1 andNum2:(int) num2{
51 return num1 + num2;
52 }
53 -(int)jian:(int) num1 andNum2:(int) num2{
54 return num1 - num2;
55
56 }
57 -(int)cheng:(int) num1 andNum2:(int) num2{
58 return num1 * num2;
59 }
60 -(float)chu:(int) num1 andNum2:(int) num2{
61 return num1 /(float) num2;
62 }
63 @end
64
65
66 #import <Foundation/Foundation.h>
67 #import "Caculator.h"
68 #import "Calculator2.h"
69 int main(int argc, const char * argv[])
70 {
71
72 @autoreleasepool {
73
74 // //创建对象
75 // Caculator *cal = [Caculator new];
76 // cal->_num1 = 10;
77 // cal->_num2 = 3;
78 //
79 // //加法
80 // [cal add];
81 // NSLog(@"%.2f",cal->_result);
82 // [cal jian];
83 // NSLog(@"%.2f",cal->_result);
84 // [cal cheng];
85 // NSLog(@"%.2f",cal->_result);
86 // [cal chu];
87 // NSLog(@"%.2f",cal->_result);
88
89 //第二种方法
90 Calculator2 *c2 = [Calculator2 new];
91
92 int result = [c2 add:12 andNum2:34];
93 int result2 = [c2 cheng:3 andNum2:10];
94 NSLog(@"%d",result);
95 NSLog(@"%d",result2);
96 }
97 return 0;
98
99 }
第二讲 类方法的调用
本小节知识点:
1、【理解】类方法概述
2、【理解】类方法的调用
Objective-C中的类可以声明两种类型的方法:实例方法和类方法。
1、类方法概述
实例方法就是一个方法,它在类的一个具体实例的范围内执行。也就是说,在你调用一个实例方法前,你必须首先创建类的一个实例。(也叫对象方法)
[对象名 对象方法名];
而类方法,比较起来,也就是说,不需要你创建一个实例。
+表示类方法,就是类调用方法,不依赖与任何对象的方法。
-表示是实例(对象)方法,只能是对象可调用,依赖与任何对象的方法。
2、类方法的调用
[类名称 类方法名称];
#import <Foundation/Foundation.h>
@interface Caculator : NSObject
//四个方法
-(int)add:(int) num1 andNum2:(int) num2;
-(int )jian:(int) num1 andNum2:(int) num2;
-(int)cheng:(int) num1 andNum2:(int) num2;
-(float)chu:(int) num1 andNum2:(int) num2;
//四个方法
+(int)add:(int) num1 andNum2:(int) num2;
+(int )jian:(int) num1 andNum2:(int) num2;
+(int)cheng:(int) num1 andNum2:(int) num2;
+(float)chu:(int) num1 andNum2:(int) num2;
@end
#import "Caculator.h"
@implementation Caculator
//四个方法对象方法
-(int)add:(int) num1 andNum2:(int) num2{
return num1 + num2;
}
-(int)jian:(int) num1 andNum2:(int) num2{
return num1 - num2;
}
-(int)cheng:(int) num1 andNum2:(int) num2{
return num1 * num2;
}
-(float)chu:(int) num1 andNum2:(int) num2{
return num1 /(float) num2;
}
//类方法的实现
//四个方法
+(int)add:(int) num1 andNum2:(int) num2{
return num1 + num2;
}
+(int)jian:(int) num1 andNum2:(int) num2{
return num1 - num2;
}
+(int)cheng:(int) num1 andNum2:(int) num2{
return num1 * num2;
}
+(float)chu:(int) num1 andNum2:(int) num2{
return num1 /(float) num2;
}
@end
1 /*
2 类方法:
3
4 +开头的方法(定义的过程和对象方法一致,只不过 + 开头)
5
6 类方法的调用:
7
8 [类名 方法名];
9
10 对比学习:
11 Dog类
12 -(void)run;
13 想调用 run方法,
14 1. Dog *dog = [Dog new];
15
16 [dog run];
17
18 Dog类
19
20 +(void)run; //类方法
21
22 想调用run方法,
23 [Dog run];
24 */
25
26
27 #import <Foundation/Foundation.h>
28 #import "Caculator.h"
29 int main(int argc, const char * argv[])
30 {
31
32 @autoreleasepool {
33 Caculator *ca1 = [Caculator new];
34 //通过ca1对象调用其对象方法
35 int result = [ca1 add:23 andNum2:34];
36
37 NSLog(@"result = %d",result);
38 //通过类名调用类方法
39 result = [Caculator add:10 andNum2:20];
40 NSLog(@"result = %d",result);
41
42
43 }
44 return 0;
45 }
第三讲 类方法的使用注意事项
【理解】类方法的使用注意事项
1、类方法可以和实例方法同名,这个并不影响使用,实例方法由实例对象访问调用,类方法要通过类里访问调用,不会有交叉相互影响。
2、类方法也可以是从父类继承而来,子类可以重写类方法,如description类方法就可以在子类里重新定义这个方法。
3、类方法和实例方法一样在interface里声明,在implementation里实现
4、类方法只能被向类发送类方法消息才被执行,向实例对象发送类方法是不能被触发执行的。
5、在类方法里使用了self,这个self执行的类对象class object而不是实例对象instance object
1 #import <Foundation/Foundation.h>
3 @interface Dog : NSObject
6 -(void)run;
7 +(void)run;
8 +(void)eat:( NSString *)foodName;
9
10 @end
11
12 #import "Dog.h"
13
14 @implementation Dog
15 -(void)run{
16 NSLog(@"对象方法 ------- 狗正在疯跑!");
18 }
19 +(void)run{
20 NSLog(@"类方法 --- 狗正在疯跑!");
22 }
23 +(void)eat:(NSString *)foodName{
24
25 NSLog(@"狗正在吃%@",foodName);
26 }
28 @end
31 #import <Foundation/Foundation.h>
32 #import "Dog.h"
33 int main(int argc, const char * argv[])
34 {
35
36 @autoreleasepool {
37 Dog *dog = [Dog new];
38 [dog run]; //对象方法
39 [Dog run]; //类方法
40
41 [Dog eat:@"一根热乎乎的热狗"];
42 }
43 return 0;
44 }
第四讲 类方法易犯的错误
本小节知识点:
1、【理解】类方法的优点
2、【掌握】类方法的易犯错误
3、【理解】类方法和对象方法的比较
1、类方法的优点:
1)节省内存空间
2)提高了效率
3)作为工具方法
2、类方法的易犯错误
1、在类方法中使用了类的成员变量
//通过类方法实现两个数的平均值
+(float) avgNum1:(int)num1 andNum2:(int)num2{
//调用类方法计算两个数的和
return -result/2.0f; // 注意: 类方法中不能使用类的成员变量
}
//通过实例方法实现两个数的平均值
-(float)avg{
//调用类方法计算两个数的和
return _result/2.0f; //注意:在实例方法中可以使用类的成员变量
}
3、类方法与对象方法比较
1)对象方法:
以 - 号开头
可以使用成员变量
用对象调用对象方法
对象方法可以调用当前对象或者其他对象的方法(是通过将对象作为参数传入方法)
1 #import <Foundation/Foundation.h>
2 #import "Dog.h"
3
4 @interface Car : NSObject
5 {
6 @public
7 int _speed;
8 }
9 -(void)run;
10 -(void)test;
11 +(void)run;
12 +(void)run:(int)speed;
13 +(void)test:(Dog *)dog;
14 +(void)t1;
15 @end
16
17 //
18
19 #import "Car.h"
20
21 @implementation Car
22 -(void)run{
23
24 NSLog(@"车正在以%d码的速度跑",_speed);
25 //对象方法中可以调用其他的对象方法
26 //1)当前对象方法中创建对象(可以是当前类的实例对象,也可以是其他类的实例对象),使用新创建的对象调用对象方法
27 // Car *car1 = [Car new];
28 // [car1 test];
29 // 其他的实例对象
30 // Person *p = [Person new];
31 // [p eat];
32 //2)可以使用self
33 [self test];
34 //3)对象作为方法的参数传递过来,可以使用传递过来的对象调用方法
35
36 }
37 -(void)test{
38
39 NSLog(@"test------");
40 }
41 +(void)run{
42 ///Volumes/VMware Shared Folders/自学视频基础笔记/视频第十八天的课程/OC6-类方法易犯错误/Car.m:17:44: Instance variable ‘_speed‘ accessed in class method
43
44 //类方法里面访问了实例变量,这是不允许的,
45 // NSLog(@"车正在以%d码的速度跑",_speed);
46 NSLog(@"类方法---车正在跑");
47
48 //在类方法中可以调用其他类方法
49 //1)可以直接使用本类类名(或者其他类名)调用类方法
50 [Car run:250];
51 [Dog run];
52 //可以使用self吗?
53 [self run:100];
54
55 }
56 +(void)run:(int)speed{
57 NSLog(@"类方法---车正在以%d码的速度跑",speed);
58
59 }
60 +(void)test:(Dog *)dog{
61
62 //在类方法中可以调用对象方法
63 //1)对象作为方法的参数传递过来
64 //2)可以创建一个对象
65 Dog *d1 = [Dog new];
66 [d1 eat];
67
68 [dog eat];
69 }
70
71 +(void)t1{
72
73 //类方法可以调用其他类方法
74 //类方法不能调用自身
75
76 // NSLog(@"Car的类方法 t1");
77 // [Car t1]; //自己调用自己 无限循环
78 }
79 @end
80
81
82 2)类方法:
83 以+开头
84 不可以使用成员变量
85 用类名调用类方法
86 类方法可以调用对象方法(是通过将对象作为参数传入方法)和类方法
87 类方法不可以调用自身,会造成死循环
88
89 #import <Foundation/Foundation.h>
90
91 @interface Dog : NSObject
92 {
93
94 }
95 +(void)run;
96 -(void)eat;
97
98 @end
99
100 #import "Dog.h"
101
102 @implementation Dog
103 +(void)run{
104 NSLog(@"狗正在疯跑");
105 }
106 -(void)eat{
107
108 NSLog(@"狗正在吃");
109 }
110 @end
111
112 #import <Foundation/Foundation.h>
113 #import "Car.h"
114 int main(int argc, const char * argv[])
115 {
116
117 @autoreleasepool {
118 //对象方法调用
119 Car *car = [Car new];
120 car->_speed = 200;
121 [car run]; //实例方法调用
122 //类方法调用
123 [Car run];
124 [Car run:50]; //对象作为方法的参数传递过来
125
126 //类方法用对象方法调用
127 Dog *d1 = [Dog new];
128 [Car test:d1]; //狗正在吃
129
130 // [Car t1]; 类方法调用自己 无限循环
131 }
132 return 0;
133 }
第五讲 类方法应用场景
本小节知识点:
【理解】OC类方法应用场景
1、OC类方法应用场景
如果我们调用一个方法,该方法中不需要使用成员变量,那么我们可以将该方法声
明为类方法。
[Car run];
练习:
有一个手机的类iPhone,该类中有一个枚举类型的实例变量_color
kColorBlack 黑色 kColorWhtie 白色 kColorTHJ 土豪金
1)请定义一个类方法,实现返回真实手机颜色,而非枚举值。
//+(NSString *)getPhoneColor:(Color)color;
1 #import <Foundation/Foundation.h>
3 typedef enum {kColorBlack,kColorWhite,kColorTHJ}Color;
4 @interface IPhone : NSObject
5 { @public
6 Color _color;
8 }
9 +(NSString *)getPhoneColor:(Color)color;
10 @end
11
12 #import "IPhone.h"
13
14 @implementation IPhone
15 +(NSString *)getPhoneColor:(Color)color{
16
17 NSString *colorName;
18 //根据color的值做判断
19 // 0 1 2
20 //kColorBlack kColorWhite kColorTHJ
21 switch (color) {
22 case kColorBlack:
23 colorName = @"黑色";
24 break;
25 case kColorWhite :
26 colorName = @"白色";
27 break;
28 case kColorTHJ:
29 colorName = @"土豪金";
30 break;
32 default:
33 break;
34 }
35 return colorName;
36 }
37 @end
38
39 #import <Foundation/Foundation.h>
40 #import "IPhone.h"
41 int main(int argc, const char * argv[])
42 {
44 @autoreleasepool {
47 NSString *str = [IPhone getPhoneColor:kColorTHJ];
48 NSLog(@"%@",str);
49 }
50 return 0;
51 }
第六讲 匿名类的概念及使用
本小节知识点:
1、【了解】匿名类的概念
2、【理解】匿名类访问成员变量
3、【理解】匿名类调用方法
1、匿名类的概念
1 #import <Foundation/Foundation.h>
2
3 @interface Car : NSObject
4 {
5 @public
6 int _speed;
7 }
8 -(void)start;
9 -(void)stop;
10 @end
11
12 #import "Car.h"
13
14 @implementation Car
15 -(void)start{
16
17 NSLog(@"车已经启动,正准备以%d的速度跑",_speed);
18 }
19 -(void)stop{
20
21 NSLog(@"咯吱,车停了");
22 }
23 @end
24
25 #import <Foundation/Foundation.h>
26 #import "Car.h"
27 int main(int argc, const char * argv[])
28 {
29
30 @autoreleasepool {
31
32 // 创建对象
33 Car *car1 = [Car new];
34
35 car1->_speed = 100;
36
37 //找到栈区,找到堆区, 找到代码区
38 [car1 start];
39
40 //[Car new]; 实质上对象的存储空间
41
42 //匿名类(匿名对象)时候用
43 //1、使用匿名类访问实例变量(能,只能访问一次)
44 //以后再次访问,实际上访问新的空间了
45 [Car new]->_speed = 250;
46 NSLog(@"_speed = %d",[Car new]->_speed); // 0
47
48 //2、使用匿名 的类,可以调用方法
49 //
50 [[Car new] stop]; //可以
51
52 // 3、 申请空间 初始化
53 [[Car alloc] init]; //等价于 [Car new];
54
55 //使用alloc init 的方式调用 stop方法
56 [[[Car alloc] init] stop];
57
58 }
59 return 0;
60 }
2、匿名类作为方法的参数
本小节知识点:
1、【掌握】匿名类作为方法的参数
2、【了解】匿名类的优缺点
1 #import <Foundation/Foundation.h>
2
3 @interface Car : NSObject
4 {
5 @public
6 int _speed;
7 }
8 -(void)start;
9 -(void)stop;
10 @end
11
12 #import "Car.h"
13
14 @implementation Car
15 -(void)start{
16
17 NSLog(@"车已经启动,正准备以%d的速度跑",_speed);
18 }
19 -(void)stop{
20
21 NSLog(@"咯吱,车停了");
22 }
23 @end
24
25 #import <Foundation/Foundation.h>
26 #import "Car.h"
27 @interface Person : NSObject
28 {
29
30 }
31 -(void)goHome:(Car *)car;
32 @end
33
34 #import "Person.h"
35
36 @implementation Person
37 -(void)goHome:(Car *)car{
38
39 //人开车回家,实质是车跑
40 [car start];
41 }
42
43 @end
44
45 #import <Foundation/Foundation.h>
46 #import "Person.h"
47 int main(int argc, const char * argv[])
48 {
49
50 @autoreleasepool {
51
52 Person *p = [[Person alloc] init ];
53 //创建一个车
54 Car *car = [Car new];
55 car->_speed = 80;
56 // [p goHome:car];
57
58 //1、匿名类作为方法的参数使用
59 // [p goHome:[Car new]];
60
61 //匿名类调用方法,参数又是匿名类
62 [[Person new] goHome:[Car new]]; //0
63 }
64 return 0;
65 }
2、匿名类优缺点
优点:可以简化代码,方便方法调用
缺点:匿名对象实例化以后,只能正确的使用成员变量一次
常见用法:
//下面两句的作用是等价的
Person *p = [[Person alloc] init];
Person *p1 = [Person new];
两者的区别:
alloc 和 init 分别把分配内存和初始化的工作分开。这样更加的灵活,可以自行初始
化对象的成员变量值
而不像new每次都初始化为0
new 是吧分配内存和初始化的工作一起完成了,先分配内存,然后调用类的构造函
数。
标签:
原文地址:http://www.cnblogs.com/xiaokang520/p/5062339.html