什麼是框架ios
衆多功能\API的集合api
Foundation框架的做用數組
Foundation框架是Mac\iOS中其餘框架的基礎緩存
Foundation框架包含了不少開發中經常使用的數據類型:服務器
結構體網絡
枚舉app
類框架
如何使用Foundation框架函數
要想使用Foundation框架中的功能,包含它的主文件便可atom
#import <Foundation/Foundation.h>
Foundation框架中的類
Foundation框架提供了很是多好用的類, 好比
NSString : 字符串
NSArray : 數組
NSDictionary : 字典
NSDate : 日期
NSData : 數據
NSNumber : 數字
Foundation框架中的類都是以NS爲前綴(Next Step的縮寫)
喬布斯於1976年創立蘋果公司
喬布斯於1985年離開蘋果公司, 創立NeXT公司, 開發了Next Step操做系統
在開發Next Step操做系統過程當中產生了Foundation框架
1997年, 蘋果公司收購NeXT公司, 喬布斯重返蘋果公司(Mac系統就是基於Next Step系統)
2007年, 蘋果公司發佈了iOS系統(iOS系統基於Mac系統)
不當心修改了系統文件
有時候會在不經意之間修改了系統自帶的頭文件, 好比NSString.h, 這時會出現如下錯誤:
解決方案很簡單, 只須要刪除Xcode的緩存便可, 緩存路徑是
/Users/用戶名/Library/Developer/Xcode/DerivedData
(默認狀況下, 這是一個隱藏文件夾)
要想看到上述文件夾, 必須在終端敲指令顯示隱藏文件夾, 指令以下
顯示隱藏文件 : defaults write com.apple.finder AppleShowAllFiles –bool true
隱藏隱藏文件 : defaults write com.apple.finder AppleShowAllFiles –bool false
(輸入指令後, 必定要從新啓動Finder)
NSString
什麼是NSString
一個NSString對象就表明一個字符串(文字內容)
通常稱NSString爲字符串類
右圖中的文字內容廣泛都是用NSString來表示的
NSString的建立
NSString的建立方式比較多
最直接的方式(這是常量字符串)
NSString *str = @"I'm in itcast.";
格式化的方式
NSString *str = [NSString stringWithFormat:@"My age is %d", 10];
NSString *str = [[NSString alloc] initWithFormat:@"My age is %d", 10];
從文件中讀取
從URL中讀取
從文件中讀取
// 用來保存錯誤信息
NSError *error = nil;
// 讀取文件內容
NSString *str = [NSString stringWithContentsOfFile:@"/Users/mj/Desktop/test.txt" encoding:NSUTF8StringEncoding error:&error];
// 若是有錯誤信息
if (error) {
NSLog(@"讀取失敗, 錯誤緣由是:%@", [error localizedDescription]);
} else { // 若是沒有錯誤信息
NSLog(@"讀取成功, 文件內容是:\n%@", str);
}
從URL中讀取
// 用來保存錯誤信息
NSError *error = nil;
// 建立URL路徑
NSURL *url = [NSURL URLWithString:@"file:///Users/mj/Desktop/test.txt"];
// 讀取文件內容
NSString *str = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
// 若是有錯誤信息
if (error) {
NSLog(@"讀取失敗, 錯誤緣由是:%@", [error localizedDescription]);
} else { // 若是沒有錯誤信息
NSLog(@"讀取成功, 文件內容是:\n%@", str);
}
URL
什麼是URL
URL的全稱是Uniform Resource Locator(統一資源定位符)
URL是互聯網上標準資源的地址
互聯網上的每一個資源都有一個惟一的URL,它包含的信息指出資源的位置
根據一個URL就能找到惟一的一個資源
URL的格式
基本URL包含協議、主機域名(服務器名稱\IP地址)、路徑
舉例: http://ios.itcast.cn/ios/images/content_25.jpg
能夠簡單認爲: URL == 協議頭://主機域名/路徑
常見的URL協議頭(URL類型)
http\https :超文本傳輸協議資源, 網絡資源
ftp :文件傳輸協議
file :本地電腦的文件
URL的建立
傳入完整的字符串建立
NSURL *url = [NSURL URLWithString:@"file:///Users/mj/Desktop/str.txt"];
經過文件路徑建立(默認就是file協議的)
NSURL *url = [NSURL fileURLWithPath:@"/Users/mj/Desktop/str.txt"];
NSString的存儲
能夠將NSString存儲到一個文件中
NSString *str = @"哇哈哈哈";
[str writeToFile:@"/Users/mj/Desktop/str.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
[str writeToURL:[NSURL URLWithString:@"/Users/mj/Desktop/str.txt"] atomically:YES encoding:NSUTF8StringEncoding error:nil];
NSString的大小寫處理
- (NSString *)uppercaseString;
所有字符轉爲大寫字母
- (NSString *)lowercaseString
所有字符轉爲小寫字母
- (NSString *)capitalizedString
首字母變大寫,其餘字母都變小寫
NSString的比較
- (BOOL)isEqualToString:(NSString *)aString;
兩個字符串的內容相同就返回YES, 不然返回NO
- (NSComparisonResult)compare:(NSString *)string;
這個方法能夠用來比較兩個字符串內容的大小
比較方法: 逐個字符地進行比較ASCII值,返回NSComparisonResult做爲比較結果
NSComparisonResult是一個枚舉,有3個值:
若是左側 > 右側,返回NSOrderedDescending,
若是左側 < 右側,返回NSOrderedAscending,
若是左側 == 右側返回NSOrderedSame
- (NSComparisonResult) caseInsensitiveCompare:(NSString *)string;
忽略大小寫進行比較,返回值與compare:一致
NSString的搜索
- (BOOL)hasPrefix:(NSString *)aString;
是否以aString開頭
- (BOOL)hasSuffix:(NSString *)aString;
是否以aString結尾
- (NSRange)rangeOfString:(NSString *)aString;
用來檢查字符串內容中是否包含了aString
若是包含, 就返回aString的範圍
若是不包含, NSRange的location爲NSNotFound, length爲0
NSRange
NSRange是Foundation框架中比較經常使用的結構體, 它的定義以下:
typedef struct _NSRange {
NSUInteger location;
NSUInteger length;
} NSRange;
// NSUInteger的定義
typedef unsigned int NSUInteger;
NSRange用來表示事物的一個範圍,一般是字符串裏的字符範圍或者數組裏的元素範圍
NSRange有2個成員
NSUInteger location : 表示該範圍的起始位置
NSUInteger length : 表示該範圍內的長度
好比@「I love iOS」中的@「iOS」能夠用location爲7,length爲3的範圍來表示
NSRange的建立
有3種方式建立一個NSRange變量
方式1
NSRange range;
range.location = 7;
range.length = 3;
方式2
NSRange range = {7, 3};
或者
NSRange range = {.location = 7,.length = 3};
方式3 : 使用NSMakeRange函數
NSRange range = NSMakeRange(7, 3);
NSString的截取和替換
- (NSString *)substringFromIndex:(NSUInteger)from;
從指定位置from開始(包括指定位置的字符)到尾部
- (NSString *)substringToIndex:(NSUInteger)to;
從字符串的開頭一直截取到指定的位置to,但不包括該位置的字符
- (NSString *)substringWithRange:(NSRange)range;
按照所給出的NSRange從字符串中截取子串
- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement;
用replacement替換target
NSString與路徑
- (BOOL)isAbsolutePath;
是否爲絕對路徑
- (NSString *)lastPathComponent;
得到最後一個目錄
- (NSString *)stringByDeletingLastPathComponent;
刪除最後一個目錄
- (NSString *)stringByAppendingPathComponent:(NSString *)str;
在路徑的後面拼接一個目錄
(也可使用stringByAppendingString:或者stringByAppendingFormat:拼接字符串內容)
NSString與文件拓展名
- (NSString *)pathExtension;
得到拓展名
- (NSString *)stringByDeletingPathExtension;
刪除尾部的拓展名
- (NSString *)stringByAppendingPathExtension:(NSString *)str;
在尾部添加一個拓展名
NSString的其餘用法
- (NSUInteger)length;
返回字符串的長度(有多少個文字)
- (unichar)characterAtIndex:(NSUInteger)index;
返回index位置對應的字符
轉爲基本數據類型
- (double)doubleValue;
- (float)floatValue;
- (int)intValue;
- (char *)UTF8String;
轉爲C語言中的字符串
NSString去除空格
去除全部的空格
[str stringByReplacingOccurrencesOfString:@" " withString:@""]
去除首尾的空格
[str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
NSMutableString
NSMutableString是NSString的子類
NSMutableString和NSString的區別
NSString是不可變的, 裏面的文字內容是不能進行修改的
NSMutableString是可變的, 裏面的文字內容能夠隨時更改
NSMutableString能使用NSString的全部方法
NSMutableString的經常使用方法
- (void)appendString:(NSString *)aString;
拼接aString到最後面
- (void)appendFormat:(NSString *)format, ...;
拼接一段格式化字符串到最後面
- (void)deleteCharactersInRange:(NSRange)range;
刪除range範圍內的字符串
- (void)insertString:(NSString *)aString atIndex:(NSUInteger)loc;
在loc這個位置中插入aString
- (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)aString;
使用aString替換range範圍內的字符串
NSArray
什麼是NSArray
NSArray是OC中的數組類, 開發中建議儘可能使用NSArray替代C語言中的數組
C語言中數組的弊端
int array[4] = {10, 89, 27, 76};
只能存放一種類型的數據
不能很方便地動態添加數組元素
不能很方便地動態刪除數組元素
NSArray的使用注意
只能存聽任意OC對象, 而且是有順序的
不能存儲非OC對象, 好比int\float\double\char\enum\struct等
它是不可變的, 一旦初始化完畢後, 它裏面的內容就永遠是固定的, 不能刪除裏面的元素, 也不能再往裏面添加元素
NSArray的建立
NSArray常見的建立方式有
+ (instancetype)array;
+ (instancetype)arrayWithObject:(id)anObject;
+ (instancetype)arrayWithObjects:(id)firstObj, ...;
+ (instancetype)arrayWithArray:(NSArray *)array;
+ (id)arrayWithContentsOfFile:(NSString *)path;
+ (id)arrayWithContentsOfURL:(NSURL *)url;
能夠將一個NSArray保存到文件中
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
- (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)atomically;
NSArray的檢索
- (NSUInteger)count;
獲取集合元素個數
- (id)objectAtIndex:(NSUInteger)index;
得到index位置的元素
- (BOOL)containsObject:(id)anObject;
是否包含某一個元素
- (id)lastObject;
返回最後一個元素
- (id)firstObject;
返回最後一個元素
NSArray的檢索
- (NSUInteger)indexOfObject:(id)anObject;
查找anObject元素在數組中的位置(若是找不到,返回-1)
- (NSUInteger)indexOfObject:(id)anObject inRange:(NSRange)range;
在range範圍內查找anObject元素在數組中的位置
NSArray的簡寫
自從2012年開始, Xcode的編譯器多了不少自動生成代碼的功能, 使得OC代碼更加精簡
數組的建立
以前
[NSArray arrayWithObjects:@"Jack", @"Rose", @"Jim", nil];
如今
@[@"Jack", @"Rose", @"Jim"];
數組元素的訪問
以前
[array objectAtIndex:0];
如今
array[0];
NSArray給全部元素髮消息
- (void)makeObjectsPerformSelector:(SEL)aSelector;
- (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(id)argument;
讓集合裏面的全部元素都執行aSelector這個方法
NSArray遍歷元素
遍歷, 就是將NSArray裏面的全部元素一個一個取出來查看
常見的遍歷方式有
普通遍歷
for (int i = 0; i<array.count; i++) { }
快速遍歷
for (id obj in array) { }
Block遍歷
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
}];
NSArray與NSString
- (NSString *)componentsJoinedByString:(NSString *)separator;
這是NSArray的方法, 用separator做拼接符將數組元素拼接成一個字符串
- (NSArray *)componentsSeparatedByString:(NSString *)separator;
這是NSString的方法, 將字符串用separator做爲分隔符切割成數組元素
NSMutableArray
什麼是NSMutableArray
NSMutableArray是NSArray的子類
NSArray是不可變的, 一旦初始化完畢後, 它裏面的內容就永遠是固定的, 不能刪除裏面的元素, 也不能再往裏面添加元素
NSMutableArray是可變的, 隨時能夠往裏面添加\更改\刪除元素
NSMutableArray添加元素
- (void)addObject:(id)object;
添加一個元素
- (void)addObjectsFromArray:(NSArray *)array;
添加otherArray的所有元素到當前數組中
- (void)insertObject:(id)anObject atIndex:(NSUInteger)index;
在index位置插入一個元素
NSMutableArray刪除元素
- (void)removeLastObject;
刪除最後一個元素
- (void)removeAllObjects;
刪除全部的元素
- (void)removeObjectAtIndex:(NSUInteger)index;
刪除index位置的元素
- (void)removeObject:(id)object;
刪除特定的元素
- (void)removeObjectsInRange:(NSRange)range;
刪除range範圍內的全部元素
NSMutableArray替換元素
- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject;
用anObject替換index位置對應的元素
- (void)exchangeObjectAtIndex:(NSUInteger)idx1 withObjectAtIndex:(NSUInteger)idx2;
交換idx1和idx2位置的元素
NSMutableArray的簡寫
設置元素
之前
[array replaceObjectAtIndex:0 withObject:@"Jack"];
如今
array[0] = @"Jack";
NSDictionary
什麼是NSDictionary
NSDictionary翻譯過來叫作」字典」
平常生活中, 「字典」的做用: 經過一個拼音或者漢字, 就能找到對應的詳細解釋
NSDictionary的做用相似: 經過一個key, 就能找到對應的value
NSDictionary是不可變的, 一旦初始化完畢, 裏面的內容就沒法修改
NSDictionary的建立
+ (instancetype)dictionary;
+ (instancetype)dictionaryWithObject:(id)object forKey:(id <NSCopying>)key;
+ (instancetype)dictionaryWithObjectsAndKeys:(id)firstObject, ...;
+ (id)dictionaryWithContentsOfFile:(NSString *)path;
+ (id)dictionaryWithContentsOfURL:(NSURL *)url;
NSDictionary的常見使用
- (NSUInteger)count;
返回字典的鍵值對數目
- (id)objectForKey:(id)aKey;
根據key取出value
將字典寫入文件中
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
- (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)atomically;
NSDictionary的遍歷
快速遍歷
for (NSString *key in dict) { }
Block遍歷
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
}];
NSDictionary的簡寫
NSDictionary的建立
之前
[NSDictionary dictionaryWithObjectsAndKeys:@"Jack", @"name", @"男", @"sex", nil];
如今
@{@"name": @"Jack", @"sex" : @"男」};
NSDictionary獲取元素
之前
[dict objectForKey:@"name」];
如今
dict[@"name」];
NSMutableDictionary
什麼是NSMutableDictionary
NSMutableDictionary是NSDictionary的子類
NSDictionary是不可變的, 一旦初始化完畢後, 它裏面的內容就永遠是固定的, 不能刪除裏面的元素, 也不能再往裏面添加元素
NSMutableDictionary是可變的, 隨時能夠往裏面添加\更改\刪除元素
NSMutableDictionary的常見操做
- (void)setObject:(id)anObject forKey:(id <NSCopying>)aKey;
添加一個鍵值對(會把aKey以前對應的值給替換掉)
- (void)removeObjectForKey:(id)aKey;
經過aKey刪除對應的value
- (void)removeAllObjects;
刪除全部的鍵值對
NSMutableDictionary的簡寫
設置鍵值對
之前
[dict setObject:@"Jack" forKey:@"name」];
如今
dict[@"name"] = @"Jack";
NSFileManager
什麼是NSFileManager
顧名思義, NSFileManager是用來管理文件系統的
它能夠用來進行常見的文件\文件夾操做
NSFileManager使用了單例模式
使用defaultManager方法能夠得到那個單例對象
[NSFileManager defaultManager]
NSFileManager的常見判斷
- (BOOL)fileExistsAtPath:(NSString *)path;
path這個文件\文件夾是否存在
- (BOOL)fileExistsAtPath:(NSString *)path isDirectory:(BOOL *)isDirectory;
path這個文件\文件夾是否存在, isDirectory表明是否爲文件夾
- (BOOL)isReadableFileAtPath:(NSString *)path;
path這個文件\文件夾是否可讀
- (BOOL)isWritableFileAtPath:(NSString *)path;
path這個文件\文件夾是否可寫
- (BOOL)isDeletableFileAtPath:(NSString *)path;
path這個文件\文件夾是否可刪除
NSFileManager的文件訪問
- (NSDictionary *)attributesOfItemAtPath:(NSString *)path error:(NSError **)error;
得到path這個文件\文件夾的屬性
- (NSArray *)subpathsAtPath:(NSString *)path;
- (NSArray *)subpathsOfDirectoryAtPath:(NSString *)path error:(NSError **)error;
得到path的全部子路徑
- (NSArray *)contentsOfDirectoryAtPath:(NSString *)path error:(NSError **)error;
得到path的當前子路徑
- (NSData *)contentsAtPath:(NSString *)path;
得到文件內容
NSFileManager的文件操做
- (BOOL)copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error;
拷貝
- (BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error;
移動(剪切)
- (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error;
刪除
NSFileManager的文件操做
- (BOOL)createDirectoryAtPath:(NSString *)path withIntermediateDirectories:(BOOL)createIntermediates attributes:(NSDictionary *)attributes error:(NSError **)error;
建立文件夾(createIntermediates爲YES表明自動建立中間的文件夾)
- (BOOL)createFileAtPath:(NSString *)path contents:(NSData *)data attributes:(NSDictionary *)attr;
建立文件
(NSData是用來存儲二進制字節數據的)
文件下載的簡單思路
2.服務器發出響應,返回文件數據
3.手機客戶端利用NSData來存放
服務器返回的文件數據
4.利用NSFileManager將NSData
裏面的文件數據寫到新的文件中
NSPoint\CGPoint
CGPoint和NSPoint是同義的
typedef CGPoint NSPoint;
CGPoint的定義
struct CGPoint {
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint;
typedef double CGFloat;
CGPoint表明的是二維平面中的一個點
可使用CGPointMake和NSMakePoint函數建立CGPoint
NSSize\CGSize
CGSize和NSSize是同義的
typedef CGSize NSSize;
CGSize的定義
struct CGSize {
CGFloat width;
CGFloat height;
};
typedef struct CGSize CGSize;
CGSize表明的是二維平面中的某個物體的尺寸(寬度和高度)
可使用CGSizeMake和NSMakeSize函數建立CGSize
NSRect\CGRect
CGRect和NSRect是同義的
typedef CGRect NSRect;
CGRect的定義
struct CGRect {
CGPoint origin;
CGSize size;
};
typedef struct CGRect CGRect;
CGRect表明的是二維平面中的某個物體的位置和尺寸
可使用CGRectMake和NSMakeRect函數建立CGRect
NSNumber
NSArray\NSDictionary中只能存放OC對象, 不能存放int\float\double等基本數據類
若是真想把基本數據(好比int)放進數組或字典中, 須要先將基本數據類型包裝成OC對象
NSNumber的建立
之前
+ (NSNumber *)numberWithInt:(int)value;
+ (NSNumber *)numberWithDouble:(double)value;
+ (NSNumber *)numberWithBool:(BOOL)value;
如今
@10;
@10.5;
@YES;
@(num);
NSNumber的經常使用方法
從NSNumber中取出以前包裝的基本數據類型
- (char)charValue;
- (int)intValue;
- (long)longValue;
- (double)doubleValue;
- (BOOL)boolValue;
- (NSString *)stringValue;
- (NSComparisonResult)compare:(NSNumber *)otherNumber;
- (BOOL)isEqualToNumber:(NSNumber *)number;
NSValue
NSNumber是NSValue的子類, 但NSNumber只能包裝數字類型
NSValue能夠包裝任意值
所以, 能夠用NSValue將結構體包裝後, 加入NSArray\NSDictionary中
常見結構體的包裝
爲了方便 結構體 和 NSValue 的轉換, Foundation提供瞭如下方法
將結構體包裝成NSValue對象
+ (NSValue *)valueWithPoint:(NSPoint)point;
+ (NSValue *)valueWithSize:(NSSize)size;
+ (NSValue *)valueWithRect:(NSRect)rect;
從NSValue對象取出以前包裝的結構體
- (NSPoint)pointValue;
- (NSSize)sizeValue;
- (NSRect)rectValue;
任意數據的包裝
NSValue提供了下列方法來包裝任意數據
+ (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;
value參數 : 所包裝數據的地址
type參數 : 用來描述這個數據類型的字符串, 用@encode指令來生成
從NSValue中取出所包裝的數據
- (void)getValue:(void *)value;
NSDate
NSDate能夠用來表示時間, 能夠進行一些常見的日期\時間處理
一個NSDate對象就表明一個時間
[NSDate date]返回的就是當前時間
NSDate日期格式化
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
// 將NSString轉換爲NSDate
NSDate *date = [formatter dateFromString:@"2010-03-24 00:00:00"];
// 將NSDate轉換爲NSString
NSLog(@"%@", [formatter stringFromDate:date]);
NSCalendar
結合NSCalendar和NSDate能作更多的日期\時間處理
得到NSCalendar對象
NSCalendar *calendar = [NSCalendar currentCalendar];
得到年月日
- (NSDateComponents *)components:(NSCalendarUnit)unitFlags fromDate:(NSDate *)date;
比較兩個日期的差距
- (NSDateComponents *)components:(NSCalendarUnit)unitFlags fromDate:(NSDate *)startingDate toDate:(NSDate *)resultDate options:(NSCalendarOptions)opts;
NSObject
NSObject能夠是全部類的基類, 內部定義了不少經常使用的方法
- (BOOL)isKindOfClass:(Class)aClass;
判斷是否爲aClass或者aClass的子類的實例
- (BOOL)isMemberOfClass:(Class)aClass
判斷是否爲aClass的實例(不包括aClass的子類)
- (BOOL)conformsToProtocol:(Protocol *)aProtocol
判斷對象是否實現了aProtocol協議
- (BOOL)respondsToSelector:(SEL)aSelector
判斷對象是否擁有參數提供的方法
- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay;
延遲調用參數提供的方法,方法所需參數用withObject傳入
NSString的其餘使用場合
經過類名的字符串形式實例化對象
Class class = NSClassFromString(@"Student");
Student *stu = [[class alloc] init];
將類名變成字符串
Class class = [Student class];
NSString *className = NSStringFromClass(class);
經過方法的字符串形式實例化方法
SEL selector = NSSelectorFromString(@"setName:");
[stu performSelector:selector withObject:@"Mike"];
將方法變成字符串
NSStringFromSelector(@selector(setName:));
集合的內存管理
集合,就是能用來容納OC對象的容器
NSArray、NSDictionary等都是
集合有一些內存管理細節
只要將一個對象添加到集合中,這個對象計數器就會 + 1(作一次retain操做)
只要將一個對象從集合中移除,這個對象計數器就會 - 1(作一次release操做)
若是集合被銷燬了,集合裏面的全部對象計數器都會 - 1(作一次release操做)