實(shí)時(shí)搜索發(fā)送請(qǐng)求
防止輸入文字過(guò)快頻繁請(qǐng)求服務(wù)器丰捷,也可以用RAC 的throttle節(jié)流器控制
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(requestSearch:) object:nil];
[self performSelector:@selector(requestSearch:) withObject:searchText afterDelay:0.3];
}
實(shí)時(shí)監(jiān)聽(tīng)textField輸入中文內(nèi)容的時(shí)候拼音岗屏,拼音不跟著響應(yīng)
- (void)textFieldDidChange:(UITextField *)textField{
if (textField.markedTextRange == nil) {
NSLog(@"text:%@", textField.text);
}
}
運(yùn)行時(shí)加載類名
// 獲取所有加載的Objective-C框架和動(dòng)態(tài)庫(kù)的名稱
const char ** objc_copyImageNames ( unsigned int *outCount );
// 獲取指定類所在動(dòng)態(tài)庫(kù)
const char * class_getImageName ( Class cls );
// 獲取指定庫(kù)或框架中所有類的類名
const char ** objc_copyClassNamesForImage ( const char *image, unsigned int *outCount );
NSLog(@"獲取指定類所在動(dòng)態(tài)庫(kù)");
NSLog(@"UIView's Framework: %s", class_getImageName(NSClassFromString(@"UIView")));
NSLog(@"獲取指定庫(kù)或框架中所有類的類名");
const char ** classes = objc_copyClassNamesForImage(class_getImageName(NSClassFromString(@"UIView")), &outCount);
for (int i = 0; i < outCount; i++) {
NSLog(@"class name: %s", classes[i]);
}
unsigned int count;
const char **classes;
Dl_info info;
查找本工程里所有vc
dladdr(&_mh_execute_header, &info);
classes = objc_copyClassNamesForImage(info.dli_fname, &count);
NSMutableArray *vcs = [NSMutableArray new];
for (int i = 0; i < count; i++) {
NSLog(@"Class name: %s", classes[i]);
NSString *className = [NSString stringWithCString:classes[i] encoding:NSUTF8StringEncoding];
Class class = NSClassFromString (className);
if ([class isSubclassOfClass:[UIViewController class]]) {
[vcs addObject:className];
}
}
注冊(cè) RunLoop監(jiān)聽(tīng)事件
注冊(cè) RunLoopObserver 可以觀測(cè)當(dāng)前 RunLoop 的運(yùn)行狀態(tài)古涧,并在狀態(tài)機(jī)切換時(shí)收到通知:
- RunLoop開(kāi)始
- RunLoop即將處理Timer
- RunLoop即將處理Source
- RunLoop即將進(jìn)入休眠狀態(tài)
- RunLoop即將從休眠狀態(tài)被事件喚醒
- RunLoop退出
當(dāng)這一次 RunLoop 迭代處理完成了所有事件灰追,馬上要休眠時(shí)
使用 CF 的帶 block 版本的注冊(cè)函數(shù)可以讓代碼更簡(jiǎn)潔
在其中的 TODO 位置递览,就可以開(kāi)始任務(wù)的收集和分發(fā)了,當(dāng)然慕嚷,不能忘記適時(shí)的移除這個(gè) observer
CFRunLoopRef runLoop = CFRunLoopGetCurrent();
CFStringRef runLoopMode = kCFRunLoopDefaultMode;
CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler
(kCFAllocatorDefault, kCFRunLoopBeforeWaiting, true, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity _) {
// TODO here
});
CFRunLoopAddObserver(runLoop, observer, runLoopMode);
利用CFRunLoopMode的特性哥牍,可以將圖片的加載放到NSDefaultRunLoopMode的mode里毕泌,這樣在滾動(dòng)UITrackingRunLoopMode這個(gè)mode時(shí)不會(huì)被加載而影響到喝检。
如何判斷網(wǎng)絡(luò)請(qǐng)求是否開(kāi)啟了代理嗅辣,防charles抓包
- (BOOL)getProxyStatus {
NSDictionary *proxySettings = (__bridge NSDictionary *)(CFNetworkCopySystemProxySettings());
NSArray *proxies = (__bridge NSArray *)(CFNetworkCopyProxiesForURL((__bridge CFURLRef _Nonnull)([NSURL URLWithString:@"http://www.baidu.com"]), (__bridge CFDictionaryRef _Nonnull)(proxySettings)));
NSDictionary *settings = [proxies objectAtIndex:0];
NSLog(@"host=%@", [settings objectForKey:(NSString *)kCFProxyHostNameKey]);
NSLog(@"port=%@", [settings objectForKey:(NSString *)kCFProxyPortNumberKey]);
NSLog(@"type=%@", [settings objectForKey:(NSString *)kCFProxyTypeKey]);
if ([[settings objectForKey:(NSString *)kCFProxyTypeKey] isEqualToString:@"kCFProxyTypeNone"]){
//沒(méi)有設(shè)置代理
return NO;
}else{
//設(shè)置代理了
return YES;
}
}
讀取文件屬性
當(dāng)試圖獲取磁盤(pán)中一個(gè)文件的屬性信息時(shí),使用 [NSFileManager attributesOfItemAtPath:error:] 會(huì)浪費(fèi)大量時(shí)間讀取可能根本不需要的附加屬性挠说。這時(shí)可以使用 stat 代替 NSFileManager澡谭,直接獲取文件屬性:
#import <sys/stat.h>
struct stat statbuf;
const char *cpath = [filePath fileSystemRepresentation];
if (cpath && stat(cpath, &statbuf) == 0) {
NSNumber *fileSize = [NSNumber numberWithUnsignedLongLong:statbuf.st_size];
NSDate *modificationDate = [NSDate dateWithTimeIntervalSince1970:statbuf.st_mtime];
NSDate *creationDate = [NSDate dateWithTimeIntervalSince1970:statbuf.st_ctime];
// etc
}
class_isMetaClass的使用場(chǎng)景
NSMutableArray *arr = [NSMutableArray new];
[arr addObject:[NSObject class]];
[arr addObject:[NSValue class]];
[arr addObject:[NSNumber class]];
[arr addObject:[NSPredicate class]];
[arr addObject:@"not a class object"];
for (int i; i<[arr count]; i++) {
id obj = [arr objectAtIndex:i];
if(class_isMetaClass(object_getClass(obj)))
{
//do sth
NSLog(@"Class: %@", obj);
}
else
{
NSLog(@"Instance: %@", obj);
}
}
過(guò)濾字符串前面和后面的空白和換行
//常用于聊天信息發(fā)送時(shí)字符串處理
[self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]
利用arc4random_uniform()產(chǎn)生隨機(jī)數(shù)
OC 中有個(gè)arc4random()
函數(shù)用來(lái)生成隨機(jī)數(shù)且不需要種子,但是這個(gè)函數(shù)生成的隨機(jī)數(shù)范圍比較大损俭,需要用取模的算法對(duì)隨機(jī)值進(jìn)行限制蛙奖,有點(diǎn)麻煩。其實(shí)Objective-C有個(gè)更方便的隨機(jī)數(shù)函數(shù)arc4random_uniform(x)
杆兵,可以用來(lái)產(chǎn)生0~(x-1)范圍內(nèi)的隨機(jī)數(shù)雁仲,不需要再進(jìn)行取模運(yùn)算。如果要生成1~x的隨機(jī)數(shù)琐脏,可以這么寫(xiě):arc4random_uniform(x)+1
攒砖。
屏蔽編譯警告
對(duì)于關(guān)閉某個(gè)警告,如果需要全局關(guān)閉的話日裙,直接在Other C Flags里寫(xiě) -Wno-...
就行了吹艇,比如 -Wextra -Wno-sign-compare
就是一個(gè)常見(jiàn)的組合。如果相對(duì)某幾個(gè)文件開(kāi)啟或禁用警告昂拂,在Build Phases的Compile Source相應(yīng)的文件中加入對(duì)應(yīng)的編譯標(biāo)識(shí)即可受神。如果只是想在某幾行關(guān)閉某個(gè)警告的話,可以通過(guò)臨時(shí)改變?cè)\斷編譯標(biāo)記來(lái)抑制指定類型的警告格侯,具體如下:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[transaction.target performSelector:transaction.selector];
#pragma clang diagnostic pop
多線程group用法
//1.創(chuàng)建隊(duì)列組
dispatch_group_t group = dispatch_group_create();
//2.創(chuàng)建隊(duì)列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//3.多次使用隊(duì)列組的方法執(zhí)行任務(wù), 只有異步方法
//3.1.執(zhí)行3次循環(huán)
dispatch_group_async(group, queue, ^{
for (NSInteger i = 0; i < 3; i++) {
NSLog(@"group-01 - %@", [NSThread currentThread]);
}
});
//3.2.主隊(duì)列執(zhí)行8次循環(huán)
dispatch_group_async(group, dispatch_get_main_queue(), ^{
for (NSInteger i = 0; i < 8; i++) {
NSLog(@"group-02 - %@", [NSThread currentThread]);
}
});
//3.3.執(zhí)行5次循環(huán)
dispatch_group_async(group, queue, ^{
for (NSInteger i = 0; i < 5; i++) {
NSLog(@"group-03 - %@", [NSThread currentThread]);
}
});
//4.都完成后會(huì)自動(dòng)通知
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"完成 - %@", [NSThread currentThread]);
});
創(chuàng)建屏幕截圖系統(tǒng)API
@interface UIScreen (UISnapshotting)
// Please see snapshotViewAfterScreenUpdates: in UIView.h for some important details on the behavior of this method when called from layoutSubviews.
- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates NS_AVAILABLE_IOS(7_0);
@end
iOS-NSDateFormatter 格式說(shuō)明
格式化參數(shù)如下:
G: 公元鼻听,例如AD公元
yy: 年的后2位
yyyy: 完整年
MM: 月,顯示為1-12
MMM: 月联四,顯示為月份簡(jiǎn)寫(xiě),如 Jan
MMMM: 月撑碴,顯示為英文月份全稱,如 Janualy
dd: 日碎连,2位數(shù)表示灰羽,如02
d: 日,1-2位顯示鱼辙,如 2
EEE: 簡(jiǎn)寫(xiě)星期幾廉嚼,如Sun
EEEE: 全寫(xiě)星期幾,如Sunday
aa: 上下午倒戏,AM/PM
H: 時(shí)怠噪,24小時(shí)制,0-23
K:時(shí)杜跷,12小時(shí)制傍念,0-11
m: 分矫夷,1-2位
mm: 分,2位
s: 秒双藕,1-2位
ss: 秒,2位
S: 毫秒
常用日期結(jié)構(gòu):
yyyy-MM-dd
HH:mm:ss.SSS
yyyy-MM-dd
HH:mm:ss
yyyy-MM-dd
MM dd yyyy
根據(jù)圖片填充相應(yīng)顏色
- (UIImage *)jsq_imageMaskedWithColor:(UIColor *)maskColor
{
NSParameterAssert(maskColor != nil);
CGRect imageRect = CGRectMake(0.0f, 0.0f, self.size.width, self.size.height);
UIImage *newImage = nil;
UIGraphicsBeginImageContextWithOptions(imageRect.size, NO, self.scale);
{
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextScaleCTM(context, 1.0f, -1.0f);
CGContextTranslateCTM(context, 0.0f, -(imageRect.size.height));
CGContextClipToMask(context, imageRect, self.CGImage);
CGContextSetFillColorWithColor(context, maskColor.CGColor);
CGContextFillRect(context, imageRect);
newImage = UIGraphicsGetImageFromCurrentImageContext();
}
UIGraphicsEndImageContext();
return newImage;
}
怎么改變uitextfield placeholder的顏色和位置
//繼承uitextfield忧陪,重寫(xiě)這個(gè)方法
- (void) drawPlaceholderInRect:(CGRect)rect {
[[UIColor blueColor] setFill];
[self.placeholder drawInRect:rect withFont:self.font lineBreakMode:UILineBreakModeTailTruncation alignment:self.textAlignment];
}
把navigationbar弄成透明的而不是帶模糊的效果
[self.navigationBar setBackgroundImage:[UIImage new]
forBarMetrics:UIBarMetricsDefault];
self.navigationBar.shadowImage = [UIImage new];
self.navigationBar.translucent = YES;
攔截網(wǎng)頁(yè)圖片 并修改圖片大小
[aWebView stringByEvaluatingJavaScriptFromString:
@"var script = document.createElement('script');"
"script.type = 'text/javascript';"
"script.text = \"function ResizeImages() { "
"var myimg,oldwidth;"
"var maxwidth=320;" //縮放系數(shù)
"var images = document.images;"
"alert(images.length);"
"for(i=0;i <images.length;i++){"
"myimg = images[i];"
"if(myimg.width > maxwidth){"
"oldwidth = myimg.width;"
"myimg.style.width = maxwidth;"
"myimg.style.height = myimg.height * (maxwidth/oldwidth);"
"}"
"}"
"}\";"
"document.getElementsByTagName('head')[0].appendChild(script);"];
[aWebView stringByEvaluatingJavaScriptFromString:@"ResizeImages();"];
最簡(jiǎn)單的獲取網(wǎng)絡(luò)get的數(shù)據(jù)
NSError *error = nil;
NSString *environmentResult = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://211.144.118.118/v1.0.0/house/job/get_url"] encoding:NSUTF8StringEncoding error:&error];
獲取某個(gè)類的成員變量嘶摊、屬性、方法
unsignedint numIvars; //成員變量個(gè)數(shù)
Ivar *vars = class_copyIvarList(NSClassFromString(@"BMKLocationService"), &numIvars);
NSString *key=nil;
for(int i = 0; i < numIvars; i++) {
Ivar thisIvar = vars[i];
key = [NSStringstringWithUTF8String:ivar_getName(thisIvar)]; //獲取成員變量的名字
NSLog(@"variable name :%@", key);
key = [NSStringstringWithUTF8String:ivar_getTypeEncoding(thisIvar)]; //獲取成員變量的數(shù)據(jù)類型
NSLog(@"variable type :%@", key);
}
free(vars);
Method*meth =class_copyMethodList(NSClassFromString(@"UIView"), &numIvars);
for(inti =0; i < numIvars; i++) {
MethodthisIvar = meth[i];
SELsel =method_getName(thisIvar);
constchar*name =sel_getName(sel);
NSLog(@"zp method :%s", name);
}
free(meth);
returnYES;
過(guò)濾掉除了數(shù)字之外的字符
NSString* simplePhoneNumber =
[[phoneNumber componentsSeparatedByCharactersInSet:
[[NSCharacterSet decimalDigitCharacterSet] invertedSet]]
componentsJoinedByString:@""];
OC叶堆、C與C++ 字符串轉(zhuǎn)換
//char * /const char * 轉(zhuǎn)NSString
NSString * strPath = [NSString stringWithUTF8String:filename];
//NSString轉(zhuǎn)char * /const char *
const char * filePathChar = [filePath UTF8String];
//轉(zhuǎn)化char 到NSString
char myChar ='a';
NSString* string =[NSString stringWithFormat:@"%c", myChar];
//提取NSString的某個(gè)字段到char
- (unichar)characterAtIndex:(NSUInteger)index;
// c++ 和 oc的本身是不能直接對(duì)接的斥杜。要通過(guò)c的api做連接的。
// string 轉(zhuǎn) NSString
string str = [aNSString UTF8String];
//NSString 轉(zhuǎn) string
string str("testStr");
NSString * aString = [NSString stringWithUTF8String:str.c_str()];
方法 可變參數(shù)
- (id)initWithTitle:(NSString*)title delegate:(id<IBActionSheetDelegate>)delegate cancelButtonTitle:(NSString*)cancelTitle destructiveButtonTitle:(NSString*)destructiveTitle otherButtonTitles:(NSString*)otherTitles, ... {
self = [self init];
self.delegate= delegate;
self.backgroundColor= [UIColorclearColor];
NSMutableArray*titles = [[NSMutableArrayalloc]init];
if(otherTitles) {
va_listargs;
va_start(args, otherTitles);
for(NSString*arg = otherTitles; arg !=nil; arg =va_arg(args,NSString* ))
{
[titlesaddObject:arg];
}
va_end(args);
}
}
強(qiáng)制繼承重寫(xiě)方法
- (BOOL)isFinished
{
[self doesNotRecognizeSelector:_cmd];
return NO;
}
(未完待續(xù))