隨手記幾個最近碰到的小問題
tips:如果有錯誤棵譬,或者有更好的詳細(xì)解答嫂侍,請隨時聯(lián)系我進(jìn)行修改沾谓。
1.UITextField輸入卡住殴胧,字符不向左移動
發(fā)現(xiàn)UITextField在輸入滿以后渗稍,光標(biāo)和輸入位置卡住不動,內(nèi)容text還在增加团滥,但不會往左移竿屹。查了內(nèi)部的UIFieldEditorContentView一切正常,無法理解灸姊。
后來發(fā)現(xiàn)是UITextField的輸入框高度小了拱燃,比如字體18,高度20的情況力惯,把高度改為24就正常了碗誉。
2.實(shí)現(xiàn)單例的方式
iOS常見的實(shí)現(xiàn)單例方式目前有三種
1.initialize
2.加鎖
3.GCD dispatch_once
注意的是,要防止直接alloc(new)創(chuàng)建對象的方式父晶,所以要重寫一些方法哮缺,拿GCD來舉例
#import "SingleInstance.h"
@interface SingleInstance ()<NSCopying,NSMutableCopying>
@end
//定義一個當(dāng)前單例對象的一個實(shí)例,并賦值為nil
static SingleInstance *instance = nil;
@implementation SingleInstance
+ (instancetype)sharedInstance
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
});
return instance;
}
//alloc會觸發(fā)甲喝,防止通過alloc創(chuàng)建一個不同的實(shí)例
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [super allocWithZone:zone];
});
return instance;
}
- (id)copyWithZone:(nullable NSZone *)zone
{
return self;
}
- (id)mutableCopyWithZone:(nullable NSZone *)zone
{
return self;
}
//手動內(nèi)存管理下寫這些
- (instancetype)retain
{
return self;
}
- (oneway void)release
{
}
- (instancetype)autorelease
{
return self;
}
- (NSUInteger)retainCount
{
return MAXFLOAT;
}
- (void)dealloc
{
}
3.查詢crash log的uuid
每一個可執(zhí)行程序都有一個build UUID來唯一標(biāo)識尝苇。Crash日志包含發(fā)生crash的這個應(yīng)用(app)的 build UUID以及crash發(fā)生的時候,應(yīng)用加載的所有庫文件的[build UUID]。
查詢crash log的uuid可以用:grep "appName armv" *crash
或者grep --after-context=2 "Binary Images:" *crash
可以得到類似如下的結(jié)果:
appName.crash-0x4000 - 0x9e7fff appName armv7 <8bdeaf1a0b233ac199728c2a0ebb4165>
/var/mobile/Applications/A0F8AB29-35D1-4E6E-84E2-954DE7D21CA1/appName.crash.app/appName
(請注意這里的0x4000茎匠,是模塊的加載地址格仲,后面用atos的時候會用到)
查詢app的uuid可以使用命令:xcrun dwarfdump -–uuid <AppName.app/ExecutableName>
比如:xcrun dwarfdump --uuid appName.app/appName
結(jié)果如下:
UUID: 8BDEAF1A-0B23-3AC1-9972-8C2A0EBB4165 (armv7) appName.app/appName
UUID: 5EA16BAC-BB52-3519-B218-342455A52E11 (armv7s) appName.app/appName
這個app有2個UUID,表明它是一個fat binnary诵冒。
它能利用最新硬件的特性凯肋,又能兼容老版本的設(shè)備。
對比上面crash文件和app文件的UUID汽馋,發(fā)現(xiàn)它們是匹配的
8BDEAF1A-0B23-3AC1-9972-8C2A0EBB4165
至于如何查crash更多的內(nèi)容侮东,可以參考參考資料。
4.NSTimer的持有對象問題
NSTimer使用容易有兩大問題
- 持有target(target再持有NSTimer就是引用循環(huán)豹芯,就算不持有悄雅,也釋放不了)
- RunloopMode的設(shè)置
這里主要說說怎么解決被持有的問題。
目前解決NSTimer的持有有兩種方式
- block方法
- proxy代理方法
iOS10特別新增了block的支持方式铁蹈,去解決被持有的問題宽闲。
其實(shí)這兩種方式本身都是一樣,就是修改NSTimer持有的target對象握牧,讓需要釋放的對象不被持有容诬,就可以在dealloc中去invalidate timer。
具體實(shí)現(xiàn)可以參考參考資料沿腰,這里不詳細(xì)說了览徒。
參考資料
CSDN地址
1.iOS崩潰crash大解析
2.分析iOS Crash文件:符號化iOS Crash文件的3種方法
3.NSTimer和實(shí)現(xiàn)弱引用的timer的方式