iOS系统API笔记


实时搜索发送请求

防止输入文字过快频繁请求服务器,也可以用RAC 的throttle节流器控制

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
    
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(requestSearch:) object:nil];
    [self performSelector:@selector(requestSearch:) withObject:searchText afterDelay:0.3];
    
}

实时监听textField输入中文内容的时候拼音,拼音不跟着响应

- (void)textFieldDidChange:(UITextField *)textField{
    if (textField.markedTextRange == nil) {
        NSLog(@"text:%@", textField.text);
    }
}

运行时加载类名

// 获取所有加载的Objective-C框架和动态库的名称
const char ** objc_copyImageNames ( unsigned int *outCount );

// 获取指定类所在动态库
const char * class_getImageName ( Class cls );

// 获取指定库或框架中所有类的类名
const char ** objc_copyClassNamesForImage ( const char *image, unsigned int *outCount );

NSLog(@"获取指定类所在动态库");

NSLog(@"UIView's Framework: %s", class_getImageName(NSClassFromString(@"UIView")));

NSLog(@"获取指定库或框架中所有类的类名");
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];
    }
}

注册 RunLoop监听事件

注册 RunLoopObserver 可以观测当前 RunLoop 的运行状态,并在状态机切换时收到通知:

  1. RunLoop开始
  2. RunLoop即将处理Timer
  3. RunLoop即将处理Source
  4. RunLoop即将进入休眠状态
  5. RunLoop即将从休眠状态被事件唤醒
  6. RunLoop退出

当这一次 RunLoop 迭代处理完成了所有事件,马上要休眠时
使用 CF 的带 block 版本的注册函数可以让代码更简洁
在其中的 TODO 位置,就可以开始任务的收集和分发了,当然,不能忘记适时的移除这个 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里,这样在滚动UITrackingRunLoopMode这个mode时不会被加载而影响到。


如何判断网络请求是否开启了代理,防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"]){
        //没有设置代理
        return NO;
    }else{
        //设置代理了
        return YES;
    }
}

读取文件属性

当试图获取磁盘中一个文件的属性信息时,使用 [NSFileManager attributesOfItemAtPath:error:] 会浪费大量时间读取可能根本不需要的附加属性。这时可以使用 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的使用场景

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);
    }
}

过滤字符串前面和后面的空白和换行

//常用于聊天信息发送时字符串处理
[self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]

利用arc4random_uniform()产生随机数

OC 中有个arc4random()函数用来生成随机数且不需要种子,但是这个函数生成的随机数范围比较大,需要用取模的算法对随机值进行限制,有点麻烦。其实Objective-C有个更方便的随机数函数arc4random_uniform(x),可以用来产生0~(x-1)范围内的随机数,不需要再进行取模运算。如果要生成1~x的随机数,可以这么写:arc4random_uniform(x)+1


屏蔽编译警告

对于关闭某个警告,如果需要全局关闭的话,直接在Other C Flags里写 -Wno-...
就行了,比如 -Wextra -Wno-sign-compare
就是一个常见的组合。如果相对某几个文件开启或禁用警告,在Build Phases的Compile Source相应的文件中加入对应的编译标识即可。如果只是想在某几行关闭某个警告的话,可以通过临时改变诊断编译标记来抑制指定类型的警告,具体如下:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[transaction.target performSelector:transaction.selector];
#pragma clang diagnostic pop


多线程group用法

//1.创建队列组
dispatch_group_t group = dispatch_group_create();
//2.创建队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//3.多次使用队列组的方法执行任务, 只有异步方法
//3.1.执行3次循环
dispatch_group_async(group, queue, ^{
    for (NSInteger i = 0; i < 3; i++) {
        NSLog(@"group-01 - %@", [NSThread currentThread]);
    }
});
//3.2.主队列执行8次循环
dispatch_group_async(group, dispatch_get_main_queue(), ^{
    for (NSInteger i = 0; i < 8; i++) {
        NSLog(@"group-02 - %@", [NSThread currentThread]);
    }
});
//3.3.执行5次循环
dispatch_group_async(group, queue, ^{
    for (NSInteger i = 0; i < 5; i++) {
        NSLog(@"group-03 - %@", [NSThread currentThread]);
    }
});
//4.都完成后会自动通知
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
    NSLog(@"完成 - %@", [NSThread currentThread]);
});

创建屏幕截图系统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 格式说明

转载

格式化参数如下:
G: 公元,例如AD公元
yy: 年的后2位
yyyy: 完整年
MM: 月,显示为1-12
MMM: 月,显示为月份简写,如 Jan
MMMM: 月,显示为英文月份全称,如 Janualy
dd: 日,2位数表示,如02
d: 日,1-2位显示,如 2
EEE: 简写星期几,如Sun
EEEE: 全写星期几,如Sunday
aa: 上下午,AM/PM
H: 时,24小时制,0-23
K:时,12小时制,0-11
m: 分,1-2位
mm: 分,2位
s: 秒,1-2位
ss: 秒,2位
S: 毫秒

常用日期结构:
yyyy-MM-dd
HH:mm:ss.SSS
yyyy-MM-dd
HH:mm:ss
yyyy-MM-dd
MM dd yyyy


根据图片填充相应颜色

原图Mask

填充颜色后效果
- (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,重写这个方法
- (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;

拦截网页图片 并修改图片大小

[aWebView stringByEvaluatingJavaScriptFromString:
 @"var script = document.createElement('script');"
 "script.type = 'text/javascript';"
 "script.text = \"function ResizeImages() { "
 "var myimg,oldwidth;"
 "var maxwidth=320;" //缩放系数
 "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();"];

最简单的获取网络get的数据

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];

获取某个类的成员变量、属性、方法

unsignedint numIvars; //成员变量个数
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)]; //获取成员变量的数据类型
    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;

过滤掉除了数字之外的字符

NSString* simplePhoneNumber =
[[phoneNumber componentsSeparatedByCharactersInSet:
  [[NSCharacterSet decimalDigitCharacterSet] invertedSet]]
 componentsJoinedByString:@""];

OC、C与C++ 字符串转换

//char * /const char * 转NSString
NSString * strPath = [NSString stringWithUTF8String:filename];

//NSString转char * /const char *
const char * filePathChar = [filePath UTF8String];

//转化char 到NSString
char myChar ='a';
NSString* string =[NSString stringWithFormat:@"%c", myChar];

//提取NSString的某个字段到char
- (unichar)characterAtIndex:(NSUInteger)index;

// c++ 和 oc的本身是不能直接对接的。要通过c的api做连接的。
// string 转 NSString
string str = [aNSString UTF8String];

//NSString 转 string
string str("testStr");
NSString * aString = [NSString stringWithUTF8String:str.c_str()];

方法 可变参数

- (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);
    }
}

强制继承重写方法

- (BOOL)isFinished
{
    [self doesNotRecognizeSelector:_cmd];
    return NO;
    
}

(未完待续)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,473评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,229评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,570评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,427评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,335评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,737评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,392评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,693评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,730评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,512评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,349评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,750评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,017评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,290评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,706评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,904评论 2 335

推荐阅读更多精彩内容