只是隨筆, 若有不知所云處, 敬請忽略.
1.ios9之后默認(rèn)不支持http, 要求必須是https 并且服務(wù)器HTTP協(xié)議必須使用1.2版本及以上. https 在傳輸數(shù)據(jù)時(shí) 通過二進(jìn)制層級加密. 傳輸?shù)氖羌用軘?shù)據(jù).
要禁止Ios9阻止 不安全傳輸.
在Info 中,app Transport Security Settings 添加一個(gè)子類 如圖.設(shè)置YES
或右鍵info.plist 用原代碼的方式打開并輸入
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
2.上傳字符串形式的二進(jìn)制圖片,上傳不成功, 解決辦法:base64編碼
3.封裝了一個(gè)NSURLConectionDataDelegete 下載,但
4.swift 1.2中范圍用 0..9 在2.0中用0...9
5.一定不要相信自己的代碼是正確的,想辦法測試一下.避免錯(cuò)誤
6.在scrollView及其子類下使用 touchbegin 不會被調(diào)用.
因?yàn)閟crollView 中有手勢,而手勢是對touch的封裝,所以往往有手勢的地方會屏蔽touch的使用.
7.多線程, 完成回調(diào)在主線程執(zhí)行代碼的方法:
>1. [self performSelectorOnMainThread: withObject: waitUntilDone:];
>2. [self performSelector: OnThread:[NSThread mainThread] withObject: waitUntilDone: ]
>3. dispatch_async(dispatch_get_main_queue(),^{})
8.子控件的alpha值 不能比 父控件的高; 若子控件alpha值大于父控件alpha值 則以父控件為基準(zhǔn).
9.如果layer.contents中的像素超出了contents的邊界 那么contents支持向外延伸顯示(在此感謝Jayden)
大致意思是: 如果需要像素顯示在長方形之外, contents image 將會支持延伸..
信步英語水平大概3.1級,請將就..
10.//消息轉(zhuǎn)發(fā)機(jī)制
/*
運(yùn)行時(shí)
調(diào)用方法意味著發(fā)送消息
//導(dǎo)入框架 <objc/runtime.h>
1).自己做一些處理
+(BOOL)resolveInstanceMethod:(SEL)sel{
if(self==@selector(run)){
class_addMethod(self,sell,(IMP)eat,@)
}
}
2).實(shí)現(xiàn)消息轉(zhuǎn)發(fā)
-(id)forwardingTargetForSelector:(SEL)aSelector{
return [[Cat alloc]init];
}
3).完整消息轉(zhuǎn)發(fā)
// 給方法加個(gè)簽名
-(NSMethodSignature *)methhodSignatureForSelector:(SEL)aSelector{
}
11.UIAlerViewController 中 的style屬性中的"取消style -- Cancle" 只能有一個(gè). 否則會崩潰;
12.UIWindow 的顯示: 顯示最后一個(gè)hidden為NO的 window; 并不是顯示keyWindow; 覆蓋; window的hidden屬性默認(rèn)為YES;
13.description方法是 NSObject的 對象方法 +(NSString *)description; NSLog中 通過%@ 打印對象 就是調(diào)用的description方法;
重寫此方法時(shí),不要在此方法內(nèi)同時(shí)寫 "%@",''self'' 會死遞歸
14.tabBarController中 通過 自身 viewControllers 數(shù)組屬性的角標(biāo) 實(shí)現(xiàn)跳轉(zhuǎn),沒有modal show push方法; push是NavigationController的自有方法.
15.修改tabBar或者tabBarItem中的 setTintColor 屬性 會把系統(tǒng)默認(rèn)的兩個(gè)控制條的渲染顏色都更改;
16.字典的枚舉遍歷
<code>enumerateKeysAndObjectsWithOptions: usingBlock:</code>
<code>enumerateKeysAndObjectsUsingBlock:</code>
17.分類中不能添加成員變量{NSString *sdf} 能添加屬性( @property) 但是要自己實(shí)現(xiàn)set get方法 分類中添加屬性的其實(shí)只是添加了set get方法的聲明;
18.Dealloc在哪個(gè)線程執(zhí)行
一個(gè)對象的dealloc方法會在該對象的引用計(jì)數(shù)變?yōu)? 的線程被調(diào)用;
19.在.m中創(chuàng)建的@property 實(shí)例變量 可用KVC拿到.(運(yùn)行時(shí))
20.info.plist文件設(shè)置
不懂英文,一直在歐陸,就不翻譯了...附[iOS keys 官方文檔](https://developer.apple.com/library/mac/documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html#//apple_ref/doc/uid/TP40009252-SW2)
21.應(yīng)用程序啟動原理
這是一篇關(guān)于程序啟動原理和UIApplication的博客
22.NSOperation 的依賴關(guān)系 可以根據(jù)UI界面的順序來實(shí)現(xiàn)優(yōu)先下載;
23.NSSeesion 可后臺下載,也可在程序關(guān)閉之后下載;
double version = [[UIDevice currentDevice].systemVersion doubleValue];//表示當(dāng)前版本號;
25.方法 + (void)load :當(dāng)某個(gè)類或者某個(gè)分類加載進(jìn)內(nèi)存中時(shí) 調(diào)用一次; (只會加載一次所以只會調(diào)用一次);
程序開始運(yùn)行會調(diào)用load方法,只要程序中包含某個(gè)類的頭文件,就會被加載.
26.block 使用 copy 是從 MRC 遺留下來的“傳統(tǒng)”,在 MRC 中,方法內(nèi)部的 block 是在棧區(qū)的,使用 copy 可以把它放到堆區(qū).在 ARC 中寫不寫都行:對于 block 使用 copy 還是 strong 效果是一樣的切平,但寫上 copy 也無傷大雅眠蚂,還能時(shí)刻提醒我們:編譯器自動對 block 進(jìn)行了 copy 操作宠纯。如果不寫 copy ,該類的調(diào)用者有可能會忘記或者根本不知道“編譯器會自動對 block 進(jìn)行了 copy 操作”柱告,他們有可能會在調(diào)用之前自行拷貝屬性值截驮。這種操作多余而低效。
轉(zhuǎn)載..
應(yīng)該是ChenYilong大牛的,鏈接就只附到這吧...具體地址煩請自行查找,更能學(xué)習(xí)很多東西;
27.測試動畫時(shí)間
let anim = toolbar.layer.animationForKey("position")
print("動畫時(shí)長 \(anim?.duration)")
給uiview添加MotionEffect
就像在Home頁的壁紙际度,隨著手機(jī)角度移動葵袭,壁紙會動。
UIInterpolatingMotionEffect * xEffect = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.x" type:UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis];
xEffect.minimumRelativeValue = [NSNumber numberWithFloat:-40.0];
xEffect.maximumRelativeValue = [NSNumber numberWithFloat:40.0];
[img addMotionEffect:xEffect];
獲取正在運(yùn)行的程序
#import <sys/sysctl.h>
- (NSArray *)runningProcesses {
int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0};
size_t miblen = 4;
size_t size;
int st = sysctl(mib, miblen, NULL, &size, NULL, 0);
struct kinfo_proc * process = NULL;
struct kinfo_proc * newprocess = NULL;
do {
size += size / 10;
newprocess = realloc(process, size);
if (!newprocess){
if (process){
free(process);
}
return nil;
}
process = newprocess;
st = sysctl(mib, miblen, process, &size, NULL, 0);
} while (st == -1 && errno == ENOMEM);if (st == 0){
if (size % sizeof(struct kinfo_proc) == 0){
int nprocess = size / sizeof(struct kinfo_proc);
if (nprocess){
NSMutableArray * array = [[NSMutableArray alloc] init];
for (int i = nprocess - 1; i >= 0; i--){
NSString * processID = [[NSString alloc]initWithFormat:
@"%d", process[i].kp_proc.p_pid];
NSString * processName = [[NSString alloc]initWithFormat:
@"%s", process[i].kp_proc.p_comm];
NSDictionary * dict = [[NSDictionary alloc]initWithObjects
:[NSArray arrayWithObjects:processID, processName
,nil] forKeys:[NSArray arrayWithObjects:
@"ProcessID",
@"ProcessName",
nil]];
[array addObject:dict];
}
free(process);
return array;
}
}
}
return nil;
}
NSArray * processes = [self runningProcesses];
for (NSDictionary * dict in processes){
NSLog(@"%@ - %@", [dict objectForKey:@"ProcessID"],
[dict objectForKey:@"ProcessName"]);
}
獲取所有已經(jīng)安裝的app
#include <objc/runtime.h>
Class LSApplicationWorkspace_class=objc_getClass("LSApplicationWorkspace");
NSObject* workspace = [LSApplicationWorkspace_class performSelector:
@selector(defaultWorkspace)];
NSLog(@"apps: %@", [workspace performSelector:@selector(allApplications)]);
轉(zhuǎn)載..當(dāng)時(shí)直接copy了...鏈接就....
NSNotification必須配對出現(xiàn)
NSNotification有add甲脏,必須在dealloc中remove眶熬,否則會造成循環(huán)引用妹笆。另外注意 NSNotification 中的target是阻塞執(zhí)行的块请。執(zhí)行的線程和poster(發(fā)送者)一致,如果想更新UI拳缠,注意應(yīng)在main_thread中執(zhí)行墩新。
NSTimer 的引用問題: 記得invalidate
必須清除NSTimer,否則造成循環(huán)引用
滑動的時(shí)候隱藏navigationbar
navigationController.hidesBarsOnSwipe = Yes
33.多態(tài) 父類指針可以接收實(shí)例化子類 如 界面?zhèn)髦?
UIViewController = segue.destinationViewController;
這里的segue.destinationViewController 可能是一個(gè)任意的UIViewController的子類;
34.重寫set方法 參數(shù)可以隨機(jī), 下面是重寫了UIImage *image的set方法.
- (void)setImage:(NSString *)image {
if (_image != [UIImage imageNamed: image]) {
[_image release];
_image = [[UIImage imageNamed: image] retain];
};
}
35.UIControl 的子類: UIButton UIPickerControl segmentControl 等
36.修改tabBar或者tabBarItem中的 setTintColor 屬性 會把系統(tǒng)默認(rèn)的兩個(gè)控制條的渲染顏色都更改;
37.分類可以添加屬性,但系統(tǒng)不會幫我們自動創(chuàng)建帶下劃線的實(shí)例變量也不會幫我們實(shí)現(xiàn) set get方法, 只會聲明set get方法;
38.Button 的contentEdgeInsets,imageEdgeInsets,titleEdgeInsets屬性 可改變Button圖片的偏移位置. 甚至可超出button的范圍顯示,詳見第9條;
39.UIImageView 中 animationImages 數(shù)組可添加 動畫圖片; 并通過設(shè)置動畫執(zhí)行時(shí)間屬性animationDuration 和 動畫重復(fù)次數(shù)animationRepeatCount 來設(shè)置動畫. 再手動調(diào)用開始動畫,即可實(shí)現(xiàn)動畫效果 [imageView startAnimating];
40.設(shè)置button中 image屬性圖片 的拉伸形式:
1.加載背景圖片
2.更改模式
3.設(shè)置給button
1).UIImage *image;
//若只想把圖片部分拉伸窟坐,而不是全部拉伸海渊,就要用此函數(shù)
2).[image sretchableImageWithLiftCapWidth: toCapHight:]
//leftCapWidth:左側(cè)不拉伸區(qū)域
//topCapHeight:上方不拉伸區(qū)域
3).添加
這是以前記下的找了一上午的Bug,留念..
使用storyBoard加載多控制器不能用alloc init 需要先加載storyBoard 然后通過storyBoard instentiate加載一個(gè)控制器. 這樣創(chuàng)建的控制器才能加載到你搭建的界面;
42.添加子控制器的 push方法是導(dǎo)航控制器的方法,只有導(dǎo)航控制器及子類可以使用; show方法是UIViewController的,所有繼承自他都可以使用.
43.modal 與 push 有關(guān)聯(lián)用push 有關(guān)聯(lián)指的是 UINavigationController子控制器;
44.統(tǒng)一設(shè)置導(dǎo)航欄顏色或 其他全局的外觀,需要在AppDelegate中 通過外觀代理獲取自身的對象 來設(shè)置. 外觀代理: appearance
例如統(tǒng)一設(shè)置導(dǎo)航欄外觀:
UINavigationBar *bar = [UINavigationBar appearance];
[bar setBackgroundImage:[UIImage imageNamed:@"NavBar64"] forBarMetrics:UIBarMetricsDefault];
NSDictionary *dict = @{NSForegroundColorAttributeName:[UIColor whiteColor]};
[bar setTitleTextAttributes:dict];
[bar setTintColor:[UIColor whiteColor]];
45.應(yīng)用程序啟動先執(zhí)行main函數(shù),根據(jù)第三個(gè)參數(shù)創(chuàng)建 UIApplication根據(jù)第四個(gè)參數(shù)創(chuàng)建AppDelegate并賦值給application的delegate屬性,然后根據(jù)info.plist加載Main.storyboard及LaunchScreen.storyboard 若沒有指定Main.storyboard 就會進(jìn)入AppDelegate 執(zhí)行application: didFinishLaunchingWithOptions:
46.如何保持圖片最原始的效果绵疲,不要渲染
[image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
47.工廠模式?
// 沒想到什么,暫用字典轉(zhuǎn)模型隨便寫一下..
#import "XBModel"
@implementation XBModel
// 此為父類方法
+ (instanstype)modelWithDict {
id obj = [[self alloc]init];
[obj setValuesForKeysWithDictionary:dict];
return obj;
}
子類中: //
若子類沒有重寫父類方法,那么調(diào)用父類的方法,父類中不使用[self alloc]創(chuàng)建,直接用[XBModel alloc]
會返回一個(gè)父類對象,使子類指針指向父類.
若是只用self則會 父類指針指向子類對象. 即用id又用self則會很靈活,因?yàn)榉祷刂凳莍nstanstype.
48.block速記符號: inline block,能夠快速敲出一個(gè)block的基本結(jié)構(gòu)
49.隊(duì)列優(yōu)先級被設(shè)置成 DISPATCH_QUEUE_PRIORITY_BACKGROUND之后,會被設(shè)置成后臺級別的隊(duì)列,它會等待所有比它級別高的隊(duì)列中的任務(wù)執(zhí)行完或CPU空閑的時(shí)候才會執(zhí)行自己的任務(wù)臣疑。例如磁盤的讀寫操作非常耗時(shí)盔憨,如果我們不需要立即獲取到磁盤的數(shù)據(jù),我們可以把讀寫任務(wù)放到后臺隊(duì)列中讯沈,這樣讀寫任務(wù)只會在恰當(dāng)?shù)臅r(shí)候去執(zhí)行而不會影響需要更改優(yōu)先級的其他任務(wù)郁岩,整個(gè)程序也會更加有效率。
50.viewDidLoad中 還沒有進(jìn)行自動布局,所以控件的Frame是設(shè)置的Frame, 而viewDidLayoutSubviews執(zhí)行完[super viewDidLayoutSubviews]之后,才是布局后的真正想要的Frame;也可在后續(xù)的viewDidApear等controller生命周期方法中獲得
51.Block 本質(zhì)是結(jié)構(gòu)體,指向結(jié)構(gòu)體的指針
52.模型繼承于NSObject 為了使用KVC
53.ctr +r 縮排
54.四句話講明白Swift閉包:
Swift中沒有指針的概念
1>閉包是一段準(zhǔn)備好的代碼塊,在需要的時(shí)候執(zhí)行
2>閉包是沒有名字的函數(shù)
3>函數(shù)是有名字的閉包
4>只要類型就可以賦值
55.重寫屬性的set方法 不僅可在 賦值之后做一些事情 也可根據(jù)需求在賦值之前做一些事情. Swift 中對應(yīng) didSet{} willSet{}
[[UIImage imageNamed:@"uusername"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
//圖片是白色,代碼之后顯示綠色, 加上
imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal后顯示正常