get請(qǐng)求和post請(qǐng)求
提交用戶的隱私數(shù)據(jù)一定要使用POST請(qǐng)求,相對(duì)于POST請(qǐng)求而言倘屹,GET請(qǐng)求的所有參數(shù)都直接暴露在URL中骂倘,請(qǐng)求的URL一般都會(huì)記錄在服務(wù)器的訪問日志中睡陪,而服務(wù)器的訪問日志是黑客攻擊的主要對(duì)象之一掺涛。
這里所說的用戶隱私數(shù)據(jù)一般來說是指登錄密碼庭敦,銀行賬號(hào)等等。
URL不允許寫中文怎么辦
可以通過轉(zhuǎn)碼的方式進(jìn)行解決
urlStr= [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
如何判斷一個(gè)實(shí)例是否屬于特定的子類型
可以使用類型操作符(is)來進(jìn)行判斷薪缆,如果實(shí)例屬于那個(gè)子類型秧廉,類型操作符返回true,反則的話返回false
let str = "abcdef"
if str is String
{
print("string")
}
else
{
print("noString")
}
遍歷所有的cell
for(NSIndexPath *cellIndex in [self.tableView indexPathsForVisibleRows])
TableViewCell *otherCell = [self.tableView cellForRowAtIndexPath:cellIndex];
棧和堆的理解
管理方式:
對(duì)于棧來講拣帽,是由編譯器自動(dòng)管理疼电,無需我們手工控制;對(duì)于堆來說诞外,釋放工作由程序員控制澜沟,容易產(chǎn)生memory leak。
申請(qǐng)大邢恳辍:
棧:在Windows下,棧是向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存的區(qū)域刊苍。這句話的意思是棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的既们,在WINDOWS下,棧的大小是2M(也有的說是1M正什,總之是一個(gè)編譯時(shí)就確定的常數(shù))啥纸,如果申請(qǐng)的空間超過棧的剩余空間時(shí),將提示overflow婴氮。因此斯棒,能從棧獲得的空間較小盾致。
堆:堆是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域荣暮。這是由于系統(tǒng)是用鏈表來存儲(chǔ)的空閑內(nèi)存地址的庭惜,自然是不連續(xù)的,而鏈表的遍歷方向是由低地址向高地址穗酥。堆的大小受限于計(jì)算機(jī)系統(tǒng)中有效的虛擬內(nèi)存护赊。由此可見,堆獲得的空間比較靈活砾跃,也比較大骏啰。
碎片問題:
對(duì)于堆來講,頻繁的new/delete勢(shì)必會(huì)造成內(nèi)存空間的不連續(xù)抽高,從而造成大量的碎片判耕,使程序效率降低。對(duì)于棧來講翘骂,則不會(huì)存在這個(gè)問題祈秕,因?yàn)闂J窍冗M(jìn)后出的隊(duì)列,他們是如此的一一對(duì)應(yīng)雏胃,以至于永遠(yuǎn)都不可能有一個(gè)內(nèi)存塊從棧中間彈出
分配方式:
堆都是動(dòng)態(tài)分配的请毛,沒有靜態(tài)分配的堆。棧有2種分配方式:靜態(tài)分配和動(dòng)態(tài)分配瞭亮。靜態(tài)分配是編譯器完成的方仿,比如局部變量的分配。動(dòng)態(tài)分配由alloca函數(shù)進(jìn)行分配统翩,但是棧的動(dòng)態(tài)分配和堆是不同的仙蚜,他的動(dòng)態(tài)分配是由編譯器進(jìn)行釋放,無需我們手工實(shí)現(xiàn)厂汗。
分配效率:
棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu)委粉,計(jì)算機(jī)會(huì)在底層對(duì)棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執(zhí)行娶桦,這就決定了棧的效率比較高贾节。堆則是C/C++函數(shù)庫(kù)提供的,它的機(jī)制是很復(fù)雜的衷畦。
簡(jiǎn)而言之栗涂,操作系統(tǒng)使用stack 段中的指針值訪問heap 段中的對(duì)象。如果stack 對(duì)象的指針沒有了祈争,則heap 中的對(duì)象就不能訪問斤程。這也是內(nèi)存泄露的原因。
assign得到的b是棧和堆都跟a相同
retain得到的b是在棧上重新開了一個(gè)地址菩混,和a共同管理在堆上的內(nèi)容
copy得到的b是棧和堆都開辟新的地址忿墅。
guard的使用
//檢查身份證扁藕,如果身份證沒帶,則不能進(jìn)入考場(chǎng)
guard let id = person["id"]else
{
print("沒有身份證疚脐,不能進(jìn)入考場(chǎng)")
return
}
//身份證和準(zhǔn)考證齊全亿柑,方可進(jìn)入考場(chǎng)
print("您的身份證號(hào)為:\(id),準(zhǔn)考證號(hào)為:\(examNumber)亮曹。請(qǐng)進(jìn)入考場(chǎng)!")
這里值得注意的是橄杨,id和examNumber可以在guard語句之外使用,也就是說當(dāng)guard對(duì)其表達(dá)式進(jìn)行驗(yàn)證后照卦,id和examNumber可在整個(gè)方法的作用域中使用式矫,并且是解包后的。
tableview左側(cè)空白處理
在ios7中役耕,UITableViewCell左側(cè)會(huì)有默認(rèn)15像素的空白采转。這時(shí)候,設(shè)置setSeparatorInset:UIEdgeInsetsZero 能將空白去掉瞬痘。
但是在ios8中故慈,設(shè)置setSeparatorInset:UIEdgeInsetsZero 已經(jīng)不起作用了。下面是解決辦法
首先在viewDidLoad方法加入以下代碼:
if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[self.tableView setSeparatorInset:UIEdgeInsetsZero];
}
if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
[self.tableView setLayoutMargins:UIEdgeInsetsZero];
}
然后在UITableView的代理方法中加入以下代碼
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
[cell setSeparatorInset:UIEdgeInsetsZero];
}
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}
UIView的clipsToBounds和CALayer的的masksToBounds之間的關(guān)系??
clipsToBounds
是指視圖上的子視圖,如果超出父視圖的部分就截取掉,
masksToBounds
卻是指視圖的圖層上的子圖層,如果超出父圖層的部分就截取掉
圖像的拉伸方法
- (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:
關(guān)于GCD的一些常用方法
// 創(chuàng)建目標(biāo)隊(duì)列
let workingQueue = dispatch_queue_create("my_queue", nil)
// 派發(fā)到剛創(chuàng)建的隊(duì)列中框全,GCD 會(huì)負(fù)責(zé)進(jìn)行線程調(diào)度
dispatch_async(workingQueue) {
// 在 workingQueue 中異步進(jìn)行
print("努力工作")
NSThread.sleepForTimeInterval(2) // 模擬兩秒的執(zhí)行時(shí)間
dispatch_async(dispatch_get_main_queue()) {
// 返回到主線程更新 UI
print("結(jié)束工作察绷,更新 UI")
}
}
多線程單例
dispatch_once_t必須是全局或static變量
//靜態(tài)變量,保證只有一份實(shí)例津辩,才能確保只執(zhí)行一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
//單例代碼
});
關(guān)于時(shí)間的一些宏
#define NSEC_PER_SEC 1000000000ull
#define USEC_PER_SEC 1000000ull
#define NSEC_PER_USEC 1000ull
NSEC:納秒拆撼。
USEC:微秒。
SEC:秒
PER:每
1 NSEC_PER_SEC喘沿,每秒有多少納秒闸度。
2 USEC_PER_SEC,每秒有多少毫秒蚜印。(注意是指在納秒的基礎(chǔ)上)
3 NSEC_PER_USEC莺禁,每毫秒有多少納秒。
mac使用技巧
在Mac下想知道某個(gè)目錄下各個(gè)文件和子目錄各占多少空間窄赋,不需要一個(gè)一個(gè)去查看哟冬。打開終端,在該目錄下輸入:du -sh *寝凌,結(jié)果是啥柒傻,你們?cè)囋嚲椭懒?/p>
很多剛開始使用Mac的用戶,一般都知道Spotlight功能较木,快速定位和檢索文件。事實(shí)上用這個(gè)功能還可以快速打開程序青柄。通過ctrl+space呼出伐债,輸入通訊或cont预侯,都可以找到通訊錄這個(gè)程序,回車即可打開
shift+command+3:全屏幕截圖峰锁;shift+command+4:通過鼠標(biāo)選取截圖萎馅。
1、Mac的原生輸入法
我在Mac下曾經(jīng)使用過很多輸入法虹蒋,包括FIT糜芳、搜狗、QQ魄衅、QIM等峭竣,這是因?yàn)镸ac的原生輸入法太不給力了。但是OS X升級(jí)到Mountain Lion之后晃虫,原生輸入法有了很大的改進(jìn)皆撩,慢慢的,現(xiàn)在最常用的變成了原生輸入法哲银,今天就為大家介紹一些Mac輸入法的操作技巧
中英文混合輸入扛吞,輸入中文的時(shí)候,打開caps lock鍵荆责,可以直接輸入英文滥比,關(guān)掉又切換回中文
選詞,通過-+號(hào)可以切換字或詞做院,通過[]可以展開候選詞列表并進(jìn)行切換
打開輸入法偏好設(shè)置盲泛,可以設(shè)置自動(dòng)校正模糊音
用 ' 可以進(jìn)行手動(dòng)分詞,比如fang'an(方案)
適用shift + 6可以輸入表情符號(hào)山憨,比如(☆_☆)凸-凸
2查乒、Safari的標(biāo)簽
當(dāng)你想在新的標(biāo)簽頁打開網(wǎng)頁時(shí),只需要按住command鍵郁竟,點(diǎn)擊鏈接即可
使用 Multi-Touch 手勢(shì)在標(biāo)簽頁中切換玛迄。在觸控板上,雙指開合即可顯示你打開的標(biāo)簽頁棚亩。在標(biāo)簽視圖中蓖议,雙指輕掃可瀏覽不同標(biāo)簽頁
通過shift+command+左右方向鍵,可以快速在Safari中打開的標(biāo)簽中進(jìn)行切換讥蟆。
設(shè)置全局打印
#ifdef DEBUG
#define DMLog(...)NSLog(@"%s%@",__PRETTY_FUNCTION__,[NSString stringWithFormat:__VA_ARGS__])
#else
#define DMLog(...) do { } while (0)
#endif
讓Xcode的控制臺(tái)支持LLDB類型的打印
- touch ~/.lldbinit
- echo display @import UIKit >> ~/.lldbinit
- echo target stop-hook add -o "target stop-hook disable" >> ~/.lldbinit
刪除
其實(shí)很簡(jiǎn)答, 看第一條命令touch ~/.lldbinit 就是在根目錄下創(chuàng)建了一個(gè)隱藏文件.lldbinit , 然后刪除這個(gè)文件就搞定啦. 打開終端然后, 在終端輸入 :
rm ~/.lldbinit 命令即可
讓程序在后臺(tái)長(zhǎng)久運(yùn)行的示例代碼:
// AppDelegate.h 文件
@property (assign, nonatomic) UIBackgroundTaskIdentifier backgroundUpdateTask;
// AppDelegate.m 文件
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[self beingBackgroundUpdateTask];
// 在這里加上你需要長(zhǎng)久運(yùn)行的代碼
[self endBackgroundUpdateTask];
}
- (void)beingBackgroundUpdateTask
{
self.backgroundUpdateTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[self endBackgroundUpdateTask];
}];
}
- (void)endBackgroundUpdateTask
{
[[UIApplication sharedApplication] endBackgroundTask: self.backgroundUpdateTask];
self.backgroundUpdateTask = UIBackgroundTaskInvalid;
}