黑馬程序員-----類方法學習引入


------<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類方法應用場景

1OC類方法應用場景

  如果我們調用一個方法,該方法中不需要使用成員變量,那么我們可以將該方法聲      

  明為類方法。

[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 是吧分配內存和初始化的工作一起完成了,先分配內存,然后調用類的構造函

  數。

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com