Objective-C里面既有實例方法也類方法。類方法(Class Method) 有時被稱為工廠方法(Factory Method)或者方便方法(Convenience method)。工廠方法的稱謂明顯和一般意義上的工廠方法不同,從本質上來說,類方法可以獨立於對象而執行,所以在其他的語言里面類方法有的時候被稱為靜態方法。
注意點一:類方法
1,類方法可以調用類方法。
2,類方法不可以調用實例方法,但是類方法可以通過創建對象來訪問實例方法。
3,類方法不可以使用實例變量。類方法可以使用self,因為self不是實例變量。
4,類方法作為消息,可以被發送到類或者對象里面去(實際上,就是可以通過類或者對象調用類方法的意思
注意點二:類方法和實例方法
1:實例方法是— 類開頭是+ 實例方法是用實例對象訪問,類方法的對象是類而不是實例,通常創建對象或者工具類。
在實例方法里,根據繼承原理發送消息給self和super其實都是發送給self
在類方法里面self是其他的類的類方法,在類方法中給self發送消息只能發類方法self是類super也是
什么時候用類方法,要創建一個實例時候獲取一個共享實例,或者獲取關於類的一些共有信息
2:類方法(class method)和實例方法(instance method)。類方法被限定在類范圍內,不能被類的實例調用(即脫離實例運行)。alloc就是一種類方法。實例方法 限定在對象實例的范圍內(即實例化之前不能運行)。init就是一種實例方法,被alloc方法返回的對象實例調用。
instance method 以減號 "-" 開頭
class method 以加號 “+” 開頭,相當於static方法
1 #import <Foundation/Foundation.h>
2 /*
3 對象方法
4 1> 減號 - 開頭
5 2> 只能由對象來調用
6 3> 對象方法中能訪問當前對象的成員變量(實例變量)
7
8 類方法
9 1> 加號 + 開頭
10 2> 只能由類(名)來調用
11 3> 類方法中不能訪問成員變量(實例變量)
12
13
14 類方法的好處和使用場合
15 1> 不依賴於對象,執行效率高
16 2> 能用類方法,盡量用類方法
17 3> 場合:當方法內部不需要使用到成員變量時,就可以改為類方法
18
19 可以允許類方法和對象方法同名
20 */
21
22
23 @interface Person : NSObject
24 {
25 int age;
26 }
27
28 // 類方法都是以+開頭
29 + (void)printClassName;
30
31 - (void)test;
32 + (void)test;
33
34 @end
35
36 @implementation Person
37
38 + (void)printClassName
39 {
40 // error:instance variable 'age' accessed in class method
41 // 實例變量age不能在類方法中訪問
42 //NSLog(@"這個類叫做Person-%d", age);
43 }
44
45 - (void)test
46 {
47 NSLog(@"111-%d", age);
48
49 //[Person test];
50 }
51
52 + (void)test
53 {
54 // 會引發死循環
55 //[Person test];
56
57 NSLog(@"333");
58
59 // 會引發死循環
60 // /[Person test];
61 }
62
63 @end
64
65 int main()
66 {
67 //[Person printClassName];
68
69 [Person test];
70
71 //Person *p = [Person new];
72 //[p test];
73
74 /*
75 -[Person printClassName]: unrecognized selector sent to instance 0x7fa520c0b370
76 */
77 // 系統會認為現在調用的printClassName是個對象方法
78 //[p printClassName];
79
80 return 0;
81 }