1、類中什么時(shí)候可以定義類方法:
- 如果你不想每次使用方法都需要?jiǎng)?chuàng)建對(duì)象開辟存儲(chǔ)空間
- 并且如果該方法中沒有使用到屬性(成員變量), 那么你可以把這個(gè)方法定義為類方法
2、如何定義類方法:
- 類方法的寫法和對(duì)象方法一模一樣, 除了前面的-號(hào)不同以外,只需要將對(duì)象方法的-號(hào)換成+, 那么就定義了一個(gè)類方法。
- 如果聲明的是對(duì)象方法那么就必須實(shí)現(xiàn)對(duì)象方法,如果聲明的是類方法那么就必須實(shí)現(xiàn)類方法,聲明和實(shí)現(xiàn)必須一一對(duì)應(yīng)。
3、類方法和對(duì)象方法的區(qū)別
對(duì)象方法以-開頭
類方法以+開頭對(duì)象方法必須用對(duì)象調(diào)用
類方法必須用類來調(diào)用對(duì)象方法中可以直接訪問屬性(成員變量)
類方法中不可以直接訪問屬性(成員變量)類方法和對(duì)象方法可以進(jìn)行相互調(diào)用
4.1對(duì)象方法中可以直接調(diào)用類方法
4.2類方法中間接調(diào)用對(duì)象方法 (注意: 不建議這樣使用)
4.3類方法中可以直接調(diào)用其它類方法
4.4對(duì)象方法中可以直接調(diào)用對(duì)象方法
4、類方法的應(yīng)用場景
如果方法中沒有使用到屬性(成員變量), 那么能用類方法就用類方法
類方法的執(zhí)行效率比對(duì)象方法高
類方法一般用于定義工具方法
字符串查找
文件操作
數(shù)據(jù)庫操作
=========================以下是代碼========================
#import <Foundation/Foundation.h>
/*
事物名稱: iPhone
屬性: 顏色, 型號(hào), cpu, 尺寸 == 成員變量
行為:打電話, 發(fā)短信, 上網(wǎng), 獲取本機(jī)信息 == 成員方法
*/
// 1.編寫類的聲明
@interface Iphone : NSObject
{
@public
float _model; // 型號(hào) 0
int _cpu; // cup 0
double _size; // 尺寸 0
int _color; // 顏色 0
}
- (void)about;
- (char *)loadMessage;
- (int)signal:(int)number;
- (int)sendMessageWithNumber:(int)number andContent:(char *)content;
// 計(jì)算器
// 如果你不想每次使用方法都需要?jiǎng)?chuàng)建對(duì)象開辟存儲(chǔ)空間
// 并且如果該方法中沒有使用到屬性(成員變量), 那么你可以把這個(gè)方法定義為類方法
// 對(duì)象方法用對(duì)象調(diào)用 類方法用類調(diào)用
//- (int)sumWithValue1:(int)value1 andValue2:(int)value2;
// 如果定義類方法, 類方法的寫法和對(duì)象方法一模一樣, 除了前面的-號(hào)不同以外 \
只需要將對(duì)象方法的-號(hào)換成+, 那么就定義了一個(gè)類方法
+ (int)sumWithValue1:(int)value1 andValue2:(int)value2;
+ (void)demo;
@end
// 2.編寫類的實(shí)現(xiàn)
@implementation Iphone
// 行為的實(shí)現(xiàn)
- (void)about
{
// NSLog(@"sum = %i", [Iphone sumWithValue1:50 andValue2:50]);
NSLog(@"型號(hào) = %f, cpu = %i, 尺寸= %f, 顏色 = %i", _model, _cpu, _size, _color);
// Iphone *p = [Iphone new];
// NSLog(@"%s", [p loadMessage]);
// NSLog(@"%s", [self loadMessage]);
}
- (char *)loadMessage
{
return "wife is god";
}
- (int)signal:(int)number
{
NSLog(@"打電話給%i", number);
return 1;
}
- (int)sendMessageWithNumber:(int)number andContent:(char *)content
{
NSLog(@"發(fā)短信給%i, 內(nèi)容是%s", number, content);
return 1;
}
// 注意: 如果聲明的是對(duì)象方法那么就必須實(shí)現(xiàn)對(duì)象方法
// 如果聲明的是類方法那么就必須實(shí)現(xiàn)類方法
+ (int)sumWithValue1:(int)value1 andValue2:(int)value2
{
// NSLog(@"型號(hào) = %f, cpu = %i, 尺寸= %f, 顏色 = %i", _model, _cpu, _size, _color);
// Iphone *p = [Iphone new];
// [p signal:123456789]; // 注意: 在企業(yè)開發(fā)中, 不建議這樣使用
return value1 + value2;
}
+ (void)demo
{
// NSLog(@"%i", [Iphone sumWithValue1:90 andValue2:90]);
NSLog(@"demo");
}
@end
int main(int argc, const char * argv[]) {
/*
// 1.通過類創(chuàng)建對(duì)象
Iphone *p = [Iphone new];
// 2.修改對(duì)象的屬性
p->_size = 3.5;
p->_color = 0;
p->_model = 4;
p->_cpu = 1;
// 3.如果給對(duì)象發(fā)消息(如果調(diào)用對(duì)象的方法)
[p about];
char *content = [p loadMessage];
NSLog(@"content = %s", content);
[p signal:13838338];
[p sendMessageWithNumber:123456789 andContent:"hi"];
// int res = [p sumWithValue1:10 andValue2:20];
int res = [Iphone sumWithValue1:10 andValue2:20];
NSLog(@"res = %i", res);
*/
// [Iphone signal:13838338];
Iphone *p = [Iphone new];
// int res = [p sumWithValue1:10 andValue2:20];
// [p about];
// [Iphone sumWithValue1:10 andValue2:20];
// [Iphone demo];
[p about];
return 0;
}
void test()
{
// 1.創(chuàng)建一個(gè)對(duì)象
/*
開辟一塊存儲(chǔ)空間
*/
// Iphone *p1 = [Iphone new];
// 2.利用對(duì)象調(diào)用加法運(yùn)算方法
// int res = [p1 sumWithValue1:50 andValue2:50];
int res = [Iphone sumWithValue1:50 andValue2:50];
NSLog(@"res = %i", res);
}