1.UIStoryBoard

2. segue跳轉傳值

3. UIColor配色

//1. 十進位制配色

[UIColor colorWithRed:163.0/255.0 green:148.0/255.0 blue:128.0/255.0 alpha:1.0];

//2. 設定16進位制顏色(同上)

[UIColor colorWithRed:0xba/255.0 green:0x21/255.0 blue:0xd5/255.0 alpha:1.0];

4. XML解析

#import <Foundation/Foundation.h>

@interface Person : NSObject

@property(nonatomic,copy) NSString *pid;

@property(nonatomic,copy) NSString *name;

@property(nonatomic,copy) NSString *sex;

@property(nonatomic,copy) NSString *age;

@end

#import <Foundation/Foundation.h>

#import "Person.h"

@interface XMLUtil : NSObject<NSXMLParserDelegate>

@property(nonatomic,strong) NSXMLParser *par;

@property(nonatomic,strong) Person *person;

//存放每個person

@property(nonatomic,strong) NSMutableArray *list;

//標記當前標籤,以索引找到XML檔案的內容

@property(nonatomic,copy) NSString *currentElement;

//宣告parse方法,通過它實現解析

-(void)parse;

@end

@implementation XMLUtil

-(instancetype)init {

self = [super init];

if (self) {

//獲取事先準備好的XML檔案

NSBundle *b = [NSBundle mainBundle];

NSString *path = [b pathForResource:@"test" ofType:@".xml"];

NSData *data = [NSData dataWithContentsOfFile:path];

self.par = [[NSXMLParser alloc] initWithData:data];

//新增代理

self.par.delegate = self;

//初始化陣列,存放解析後的資料

self.list = [NSMutableArray arrayWithCapacity:5];

}

return self;

}

//幾個代理方法的實現,是按邏輯上的順序排列的,但實際呼叫過程中中間三個可能因為迴圈等問題亂掉順序

//(1).開始解析

-(void)parseDiaStartCocument:(NSXMLParser *)parser {

NSLog(@"parserDidStartDocument...");

}

//(2).準備節點

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict {

self.currentElement = elementName;

if ([self.currentElement isEqualToString:@"student"]) {

self.person = [[Person alloc] init];

}

}

//(3). 獲取節點內容

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {

if ([self.currentElement isEqualToString:@"pid"]) {

[self.person setPid:string];

}else if ([self.currentElement isEqualToString:@"name"]) {

[self.person setName:string];

}else if ([self.currentElement isEqualToString:@"sex"]) {

[self.person setSex:string];

}else if ([self.currentElement isEqualToString:@"age"]) {

[self.person setAge:string];

}

}

//(4). 解析完一個節點

-(void)parseDidEndDocument:(NSXMLParser *)parser {

NSLog(@"parserDidEndDocument...");

}

//外部呼叫藉口

-(void)parse {

[self.par parse];

}

@end

5. JSON解析

//1. Json資料封包

NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key2",@"value3",@"key3", nil];

//isValidJSONSerialization判斷物件是否可以構建成json物件

if ([NSJSONSerialization isValidJSONObject:dic]) {

NSError *error;

//建立一個json從Data,NSJSONWritingPrettyPrinted指定的JSON資料產的空白,使輸出更具可讀性

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:&error];

NSString *json = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

NSLog(@"json data:%@",json);

}

//2. Json資料解析

NSError *error;

//載入一個NSURL物件

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://m.weather.com.cn/data/101120101.html"]];

//將請求的url資料放到NSData物件中

NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

//IOS自帶解析類NSJSONSerialization從response中解析出資料放到字典中 - crash here - TBD

NSDictionary *weatherDic = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error];

NSDictionary *weatherInfo = [weatherDic objectForKey:@"weatherinfo"];

//    NSDictionary *text = [NSString stringWithFormat:@"今天是%@ %@ %@ 的天氣狀況是:%@ %@",

//                          [weatherInfo objectForKey:@"day_y"],

//                          [weatherInfo objectForKey:@"week"],

//                          [weatherInfo objectForKey:@"city"],

//                          [weatherInfo objectForKey:@"weather1"],

//                          [weatherInfo objectForKey:@"temp1"]];

NSDictionary *text = [NSString stringWithFormat:@"今天是 %@ %@ %@ 的天氣狀況是: %@ %@",[weatherInfo objectForKey:@"day_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"],[weatherInfo objectForKey:@"weather1"],[weatherInfo objectForKey:@"temp1"]

];

NSLog(@"weatherInfo: %@",text);

6. 多執行緒

////    1.NSThread - 蘋果封裝後,並且完全面向物件

//    //(1). 先建立執行緒類,在啟動

//    //建立

//    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run:) object:nil];

//

//    //啟動

//    [thread start];

//

//    //(2). 建立並啟動

//    [NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:nil];

//2. GCD - 蘋果為多核的並行運算提出的解決方案

//在GCD中,加入了2個非常重要的概念:任務和佇列.

//佇列:分序列和並行2種

//(1). 主佇列:用於重新整理UI

//建立

//    dispatch_queue_t queue = dispatch_get_main_queue();

//(2).自己建立的佇列:用於耗時漸咋

//序列佇列

//    dispatch_queue_t queue = dispatch_queue_create("tk.bourne.testQueue", NULL);

//並行佇列

//    dispatch_queue_t queue = dispatch_queue_create("tk.courne.testQueue", DISPATCH_QUEUE_SERIAL);

//(3). 全域性並行佇列:只要是並行佇列任務一般都加入到這個佇列,這是系統提供的一個併發佇列

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_SERIAL, 0);

//任務:分同步和非同步兩種

//(1).同步任務:不會另開執行緒,會阻塞當前執行緒

dispatch_sync(queue, ^{

//code here

});

//(2).非同步任務:會另開執行緒,不會阻塞當前執行緒

dispatch_sync(queue, ^{

//code here

});

//3. NSOperation和NSOperationQueue

/*

對GCD的封裝,完全面向物件,NSOperation和NSOperationQueue分別對應GCD的任務和佇列。

操作步驟:  1. 將要執行的任務封裝到一個NSOperation物件中.

2. 將此任務新增到一個NSOperationQueue物件中.

注意:NSOperation只是一個抽象類,所以不能封裝任務。但它有2個子類用於封裝任務。

分別是:NSInvocationOperation 和 NSBlockOperation。建立一個Operation後,

需要呼叫start方法來啟動任務,它會預設在當前佇列同步執行。當然可以在中途取消一個任務,

只需要呼叫起cancel方法即可.

*/

//NSInvocationOperation:需要傳入一個方法名

//1.建立NSInvocation物件

//    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];

//

//    //2.開始執行

//    [operation start];

//1.建立NSBlockOperation物件

NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{

}];

//可以新增多個block

for (NSInteger i = 0; i < 5; i ++ ) {

[operation addExecutionBlock:^{

NSLog(@"第%ld次: %@",i,[NSThread currentThread]);

}];

}

//2.開始執行

[operation start];

7.動畫效果

8. NSUserDefaults

//.簡介

/*

NSUserDefaults是一個單例

他可以用於資料的永久儲存,而且簡單實用,這是它可以讓資料自由傳遞的一個前提,

也是大家喜歡用它儲存簡單資料的一個主要原因.

*/

//1. NSUserDefaults

// NSUserDefaults支援的資料型別有: NSNumber(NSInteger、float、double),NSString、NSDate、NSArray、NSDictionary、BOOL;

//將NSString物件儲存到NSUserDefaults中

//    NSString *passWord = @"123456";

//    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];

//    [user setObject:passWord forKey:@"userPassWord"];

//將資料取出來

NSUserDefaults *user = [NSUserDefaults standardUserDefaults];

NSString *passWord = [user objectForKey:@"userPassWord"];

//2.NSUserDefaults儲存物件

//NSUserDafaults本身不支援自定義物件的儲存,不過它支援NSData的型別,所以可以選擇使用歸檔,將自定義物件轉為NSData型別後存入NSUserDefaults.

//(1).將Student類的資料歸檔

//(2).將Student物件存入NSUserDefaults

Student *student = [[Student alloc] int];

student.name = @"ladyO";

student.sex = @"女";

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:student];

NSUserDefaults *user = [NSUserDefaults standardUserDefaults];

[user setObject:data forKey:@"oneStudent"];

//(3).從NSUserDefaults取出Student物件

NSUserDefaults *user = [NSUserDefaults standardUserDefaults];

NSData *data = [user objectForKey:@"oncStudent"];

Student *student = [NSKeyedArchiver unarchiveObjectWithData:data];

9. 網路請求