1. 程式人生 > >【Objective-C】05-OC物件中類方法和物件方法的比較

【Objective-C】05-OC物件中類方法和物件方法的比較

一、類方法

1.1 噹噹前方法中不涉及類的成員變數時,可以把方法宣告成類方法。這樣做的好處是可以不用宣告類的例項物件,減少記憶體空間的佔用,提高執行效率。即類的方法不依賴於物件。

1.2 以加號 + 開頭

1.3 只能由類(名)來呼叫

1.4 類方法中不能訪問類的成員變數。如果訪問,會報 error:instance variable 'age' accessed in class method。

1.5 在類方法中呼叫自身,會導致程式陷入死迴圈

二、物件方法

2.1 噹噹前方法中需要訪問類的成員變數時,可以把方法宣告為物件方法。

2.2 以減號 - 開頭

2.3 只能由物件來呼叫

2.4 物件方法中能訪問當前物件的成員變數(例項變數)

三、類方法和物件方法可以同名

#import <Foundation/Foundation.h>
@interface Person:NSObject
{
    //年齡
    int _age;
}
//獲取年齡值
- (int)age;
//設定年齡值
- (void)setAge:(int)age;
//類方法:列印當前類名
+ (void)printfClassName;
//物件方法:列印當前物件的年齡
- (void)test;
//類方法:列印“333”
+ (void)test;
@end

@implementation Person
- (int)age
{
    return _age;
}

- (void)setAge:(int)age
{
    _age=age;
}

+ (void)printfClassName
{
    NSLog(@"這個類叫做Person");
    //類方法中不能訪問例項變數:use of undeclared identifier 'age'
    //NSLog(@"這個類叫做Person-%d",age);
}

- (void)test
{
    NSLog(@"111-%d",[self age]);
}

+ (void)test
{
    NSLog(@"333");
    //在類方法中呼叫自己,會引發死迴圈
    //[Person test];
}

@end
int main()
{
    //呼叫類方法
    [Person printfClassName];
    //呼叫類方法
    [Person test];
    //建立Person物件
    Person *p  =[Person new];
    //設定當前物件的年齡
    [p setAge:20];
    //列印當前物件的年齡
    [p test];
}