面向?qū)ο缶幊蹋╫op)
-
基本概念
- 對(duì)象:對(duì)象是消息的接收者
- 類(lèi):類(lèi)是對(duì)象的藍(lán)圖和模板
- 消息:對(duì)象之間通信的手段
-
四大支柱
- 抽象:創(chuàng)建類(lèi)的過(guò)程就是一個(gè)抽象的過(guò)程,需要進(jìn)行數(shù)據(jù)抽象(找到和對(duì)象相關(guān)的屬性)和行為抽象(找到和對(duì)象相關(guān)的方法)遭京。
- 封裝:隱藏一切可以隱藏的實(shí)現(xiàn)細(xì)節(jié)(累的成員變量、方法的具體實(shí)現(xiàn))癞埠,向外界(調(diào)用者)提供最簡(jiǎn)單的編程接口(方法)。
- 繼承:從已經(jīng)有的類(lèi)創(chuàng)建新類(lèi)的過(guò)程雹仿。提供繼承信息的類(lèi)稱(chēng)之為父類(lèi)(超類(lèi)勺像、基類(lèi)),得到繼承信息的類(lèi)稱(chēng)之為子類(lèi)(派生類(lèi)凫乖、衍生類(lèi))确垫。
- 多態(tài):同樣的消息不同的執(zhí)行方式(不看指針看對(duì)象,相同類(lèi)型的指針指向不同子類(lèi)型的對(duì)象執(zhí)行相同的消息表現(xiàn)出不同的行為)帽芽。
-
三個(gè)步驟
- 定義類(lèi)
- 創(chuàng)建對(duì)象
- 發(fā)消息
定義類(lèi):
類(lèi)的聲明部分:
@interface 類(lèi)名 : 父類(lèi)名 {
//成員變量(數(shù)據(jù)抽象)
}
// 屬性(數(shù)據(jù)抽象)
// 初始化方法
// 方法(行為抽象)
@end
類(lèi)的實(shí)現(xiàn)部分:
@implementation 類(lèi)名
// 方法的實(shí)現(xiàn)
創(chuàng)建對(duì)象:
類(lèi)名 *對(duì)象指針 = [[類(lèi)名 alloc] 初始化方法];
發(fā)消息:
[對(duì)象指針 方法名];
返回可I型 變量名 = [對(duì)象指針 方法標(biāo)簽:參數(shù)];
[對(duì)象指針 方法標(biāo)簽1:參數(shù)1 標(biāo)簽2:參數(shù)2];
例子:
#import <Foundation/Foundation.h>
// Step 1. 定義類(lèi)
// 數(shù)據(jù)抽象: 找到和類(lèi)(對(duì)象)相關(guān)的屬性(找名詞)
// 行為抽象: 找到和類(lèi)(對(duì)象)相關(guān)的方法(找動(dòng)詞)
// 類(lèi)的聲明部分
@interface Circle : NSObject {
// 數(shù)據(jù)抽象
@private double _radius;
}
// 類(lèi)方法 +號(hào) 通過(guò)類(lèi)名直接調(diào)用(給類(lèi)發(fā)消息)
// 對(duì)象方法 -號(hào) 必須先創(chuàng)建對(duì)象才能調(diào)用(給對(duì)象發(fā)消息)
+ (instancetype) circleWithRadius:(double) radius;
// 初始化方法
//- (instancetype) initWithRadius:(double) radius;
// 行為抽象
- (double) perimeter;
- (double) area;
@end
// 類(lèi)的實(shí)現(xiàn)部分
@implementation Circle
// 在類(lèi)方法中self代表類(lèi)
+ (instancetype)circleWithRadius:(double)radius {
return [[self alloc] initWithRadius:radius];
}
// 在對(duì)象方法中self代表對(duì)象
- (instancetype) initWithRadius:(double) radius {
if (self = [super init]) {
_radius = radius;
}
return self;
}
- (double) perimeter {
return 2 * M_PI * _radius;
}
- (double) area {
return M_PI * _radius * _radius;
}
@end
static const double WALL = 5.5;
static const double AISLE = 7.8;
int main() {
// 自動(dòng)釋放池(離開(kāi)釋放池申請(qǐng)的內(nèi)存會(huì)做一次釋放操作)
@autoreleasepool {
printf("請(qǐng)輸入游泳池的半徑: ");
double r;
scanf("%lf", &r);
// Step.2 創(chuàng)建對(duì)象
// 用中綴符語(yǔ)法給對(duì)象發(fā)消息
Circle *smallCircle = [Circle circleWithRadius:r];
Circle *bigCircle = [Circle circleWithRadius:r + 3];
// Step.3 給對(duì)象發(fā)消息求解問(wèn)題
printf("The price of aisle is $%.2f\n",
([bigCircle area] - [smallCircle area]) * AISLE);
printf("The price of wall is $%.2f\n", [bigCircle perimeter] * WALL);
}
return 0;
}
系統(tǒng)常用類(lèi)
-
字符串的使用(NSString/NSMutableString)
- 創(chuàng)建字符串
- +string
- +stringWithFormat:
- +stringWithUTF8String:
- +stringWithContentsOfFile:
- +stringWithContenstOfURL:
- 常用方法和屬性
- length 獲得字符串長(zhǎng)度
- -characterAtIndex: 取指定位置的字符
- UTF8String 將字符串轉(zhuǎn)成UTF編碼的字符串
- -stringByAppendingString: 追加字符串
- -stringByAppendingFormat: 追加帶樣式的字符串
- -componentsSeparatedByString: 拆分字符串
- -substringFromIndex: 從指定位置取子串
- -substringToIndex: 取到指定位置的子串
- -substringWithRange: 取指定位置和長(zhǎng)度的子串
- -containsString: 判斷有沒(méi)有包含另一個(gè)字符串
- -rangeOfString: 查找另一個(gè)字符串出現(xiàn)的位置
- -stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement: 用指定字符串替換某些字符串
- -compare: 比較兩個(gè)字符串
- -isEqualToString: 判斷兩個(gè)字符串內(nèi)容是否相同
- -hasPrefix: 判斷字符串是否以指定的字符串開(kāi)頭
- -hasSuffix: 判斷字符串是否以指定的字符串結(jié)尾
- -uppercaseString: 獲得大寫(xiě)字符串
- -lowercaseString: 獲得小寫(xiě)字符串
- -capitalizedString: 獲得首字母大寫(xiě)字符串
- NSMutableString 特有的:
- -appendFormat: 追加字符串
- -appendString: 追加帶格式的字符串删掀。
- -insertString: atIndex: 在指定位置插入字符串
- -replaceCharactersInRange: withString: 用指定的字符串替換指定范圍的字符串
- 創(chuàng)建字符串
-
數(shù)組(NSArray/NSMutableArray)
// 數(shù)組里面只能放對(duì)象指針,不能放基本數(shù)據(jù)類(lèi)型
// 頻繁的修改數(shù)組元素建議使用NSMutableArray- containsObject: 判斷數(shù)組中有沒(méi)有指定對(duì)象
- count 數(shù)組元素的個(gè)數(shù)
- firstObject 取數(shù)組中第一個(gè)元素
- lastObject 取數(shù)組中最后一個(gè)元素
- indexOfObject: 在數(shù)組中查找指定的對(duì)象返回位置(下標(biāo))或者(NSNotFound)
- sortedArrayUsingDescriptor: 用指定的排序描述符創(chuàng)建一個(gè)元素有序的數(shù)組
NSMutableArray 特有的方法:
- addObject: 向數(shù)組中添加元素
- addObjectsFromArray: 批量添加元素
- insertObject:atIndex: 在指定位置插入元素
- removeAllObjects:刪除所有元素
- removeLastObject:刪除最后一個(gè)元素
- removeObject:刪除指定的元素
- removeObjectAtIndex:刪除指定位置的元素
- sortUsingDescriptor:用指定的描述對(duì)數(shù)組進(jìn)行排序
-
字典(NSDictionary/NSMutableDictionary)
- count 鍵值對(duì)組合的數(shù)量
- allkeys 獲得所有的鍵
- allValues 獲得所有的值
- -objectForKey: 查找指定鍵的值
NSMutableDictionary的方法 - -serObject:forKey: 添加新的鍵值對(duì)組合
- -removeObjectForObject: 根據(jù)指定的鍵刪除鍵值對(duì)組合
- -removeAllObjects: 刪除所有的鍵值對(duì)組合
類(lèi)別(Category)
給已有的類(lèi)打一個(gè)補(bǔ)丁包嚣镜,增強(qiáng)它的功能爬迟。
一個(gè)類(lèi)方法比屬性更重要。
#import <Foundation/Foundation.h>
@interface NSString (Util)
- (instancetype) reverse;
- (instancetype) encodeWithKey:(NSInteger) key;
- (instancetype) decodeWithKey:(NSInteger) key;
@end
#import "NSString+Util.h"
@implementation NSString (Util)
- (instancetype) reverse {
NSMutableString *mStr = [NSMutableString string];
for (NSInteger i = self.length - 1; i >= 0; i--){
unichar ch = [self characterAtIndex:i];
[mStr appendFormat:@"%C", ch];
}
return [mStr copy];
}
- (instancetype) encodeWithKey:(NSInteger) key {
NSMutableString *mStr = [NSMutableString string];
for(int i = 0; i < self.length; i++){
unichar ch = [self characterAtIndex:i];
ch = ch ^ key;
[mStr appendFormat:@"%C", ch];
}
return [mStr copy];
}
- (instancetype) decodeWithKey:(NSInteger) key {
return [self encodeWithKey:key];
}
@end
#import <Foundation/Foundation.h>
#import "NSString+Util.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSString *str = @"我恨你中國(guó)";
NSLog(@"%@", [str reverse]);
NSString *encodedStr = [str encodeWithKey:100];
NSLog(@"%@", encodedStr);
NSLog(@"%@", [encodedStr decodeWithKey:100]);
}
return 0;
}
提示:在Category定義的方法命名時(shí)菊匿,最好加上命名前綴,例如命名類(lèi)的前綴時(shí)ZP计福,那么Category中的方法應(yīng)加上zp_前綴跌捆,這樣做主要是為了讓調(diào)用者能夠區(qū)分是蘋(píng)果原生的方法還是Category新加的方法。
屬性(Property)
//一個(gè)頂三個(gè)
@property (屬性修飾符) 類(lèi)型 變量名象颖;
在默認(rèn)的情況下佩厚,屬性會(huì)自動(dòng)合成成員變量以及setter(修改器)、getter(訪問(wèn)器)方法说订,如果不愿意使用自動(dòng)合成抄瓦,也可以在類(lèi)的實(shí)現(xiàn)部分(.m)通過(guò)@synthesize指令指定屬性如何合成。
說(shuō)明:如果需要向外部暴露對(duì)象的某個(gè)屬性就是用@property陶冷,這樣可以通過(guò)點(diǎn)語(yǔ)法來(lái)操作這個(gè)屬性钙姊;如果不想暴露對(duì)象的某個(gè)屬性(將數(shù)據(jù)保護(hù)起來(lái))就應(yīng)該直接定義成員變量。