-
github
項目 | 簡介 |
---|---|
MGDS_Swif | 逗視視頻直播 |
MGMiaoBo | 喵播視頻直播 |
MGDYZB | 斗魚視頻直播 |
MGDemo | n多小功能合集 |
MGBaisi | 高度仿寫百思 |
MGSinaWeibo | 高度仿寫Sina |
MGLoveFreshBeen | 一款電商App |
MGWeChat | 小部分實現(xiàn)微信功能 |
MGTrasitionPractice | 自定義轉(zhuǎn)場練習(xí) |
DBFMDemo | 豆瓣電臺 |
MGPlayer | 一個播放視頻的Demo |
MGCollectionView | 環(huán)形圖片排布以及花瓣形排布 |
MGPuBuLiuDemo | 瀑布流--商品展 |
MGSlideViewDemo | 一個簡單點的側(cè)滑效果普气,仿QQ側(cè)滑 |
MyResume | 一個展示自己個人簡歷的Demo |
GoodBookDemo | 好書 |
-
2、逗視:逗你玩的直播App,可下載試玩
看下效果
- 前言: 對于程序的開發(fā)者來說,擁有一手強(qiáng)大的DEBUG能力,那就好比在武俠世界中擁有一種強(qiáng)大的內(nèi)功心法一樣晦嵌,走到哪里都是大寫的牛B。在我們DEBUG的時候,大部分情況都是要查看我們的調(diào)試日志的惭载,這些打印日志可以幫我們精確的定位問題的位置旱函。在OC的編程中,我們一般使用NSLog函數(shù)來進(jìn)行一些打印的工作描滔,這大致相當(dāng)于C語言的printf輸出語句棒妨。
1.基本使用
NSLog定義在NSObjCRuntime.h中,如下所示:
void NSLog(NSString *format, …);
省略號表示可接收多個參數(shù)含长。
NSLog使用起來和printf是很相似的券腔,都是格式化的輸出,不同的是printf需要的格式化字符串是char *類型拘泞,而NSLog需要的字符串是NSString型纷纫。
- NSLog中會使用到的格式化占位符:
%@ 對象
%d, %i 整數(shù)
%u 無符整形
%f 浮點/雙字
%x, %X 二進(jìn)制整數(shù)
%o 八進(jìn)制整數(shù)
%zu size_t
%p 指針
%e 浮點/雙字 (科學(xué)計算)
%g 浮點/雙字
%s C字符串
%.*s Pascal字符串
%c 字符
%C unichar
%lld 64位長整數(shù)(long long)
%llu 無符64位長整數(shù)
%Lf 64位雙字
舉個例子eg:
// 直接打印字符串
NSLog(@"this is a string");
// 打印OC對象
NSString *string = @"hello world";
NSLog(@"%@", string);
// 打印基本數(shù)據(jù)類型
NSLog(@"int : %d, float : %f", 2, 3.14);
2. description 方法
通過上面的例子我們不難發(fā)現(xiàn)在NSLog中使用%@占位符來打印對象的功能是非常強(qiáng)大的,它不僅可以打印字符串陪腌、字典辱魁、數(shù)組等OC中已經(jīng)定義的對象類型,我們自定義的對象類型也可以使用%@來打印诗鸭。NSLog配合%@使用時染簇,編譯器會自動調(diào)用被打印對象的description方法,如果打印的是類對象則調(diào)用類方法只泼,實例對象則調(diào)用實例方法剖笙。繼承于NSObject類的description方法默認(rèn)會打印該對象的類名和它在內(nèi)存中的地址。
- 新建一個People類请唱,自定義description方法,調(diào)試打印过蹂。
- People.h:
#import <Foundation/Foundation.h>
@interface People : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *sex;
@property (nonatomic, assign) int age;
@end
- People.m:
#import "People.h"
@implementation People
// 不要嘗試在description方法中返回self十绑,因為會出現(xiàn)死循環(huán)
-(NSString *)description {
/*
// 錯誤示范
return [NSString stringWithFormat:@"%@", self];
*/
return [NSString stringWithFormat:@"name: %@, sex: %@, age: %d",
self.name, self.sex, self.age];
}
+(NSString *)description {
return @"People";
}
@end
- 測試代碼:
// 創(chuàng)建并初始化一個People實例p
People *p = [[People alloc] init];
p.name = @"jack";
p.sex = @"man";
p.age = 18;
// 打印實例p,調(diào)用自己定義的description實例方法
NSLog(@"%@", p);
// 打印People類酷勺,調(diào)用自己定義的description類方法
NSLog(@"%@", [p class]); // 類對象或者實例對象調(diào)用class方法會返回對象的類的所有信息本橙,返回值為Class類型
自己實現(xiàn)description方法可以打印我們想要看到的內(nèi)容,更加便于調(diào)試脆诉,但是在description方法中不要返回或者打印self甚亭。
3.自定義打印日志輸出內(nèi)容
從上面的例子我們可以看到使用NSLog打印出來的日志前面帶有很長一串的時間戳,可能有時候我們根本用不到击胜,而且還會影響查看的效率亏狰。其實對于NSLog的輸出格式我們也是可以自定義的,只需要我們寫一個宏定義就可以了偶摔。
- 如果只想讓NSLog打印我們輸出的內(nèi)容:
#define NSLog(FORMAT, ...) fprintf(stderr,"%s\n",[[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
- 附加輸出文件名和打印語句的行號:
#define NSLog(FORMAT, ...) fprintf(stderr,"%s:%d\t %s\n",[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
由于NSLog的使用效率比較低暇唾,所以在我們的項目中非調(diào)試狀態(tài)下不應(yīng)該出現(xiàn)大量的NSLog,所以有些時候我們會在項目的.pch文件中去定義一個宏,讓調(diào)試打印函數(shù)只在調(diào)試的時候有用策州,發(fā)布的時候就不能使用瘸味。
在Xcode6之前,項目中Supporting files文件夾下有個 “工程名-Prefix.pch”文件,你可以在該文件下聲明我們的宏够挂,這樣之后工程中的任何一個文件中都可以使用該宏(也就是說可以在.pch中放一些全局的東西)旁仿。Xcode6之后,可能是因為大家把大量的頭文件和宏定義放到pch里邊孽糖,導(dǎo)致編譯時間過長丁逝,蘋果就去掉了pch文件,但是我們?nèi)钥梢允謩犹砑印?/p>
- 實用版本:
#ifdef DEBUG
#define NSLog(FORMAT, ...) MGLog(stderr,"%s:%d\t %s\n",[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
#else
#define NSLog(...)
#endif