iOS零碎知识点<中阶版>

iOS零碎知识点<初级版>
iOS零碎知识点<中阶版>
iOS零碎知识点<高阶版>
iOS零碎知识点<工具篇>

获取属性列表

            unsigned int count = 0;
            Ivar *members = class_copyIvarList([obj class], &count);
            for (int i = 0 ; i < count; i++) {
                Ivar var = members[i];
                //获取变量名称
                const char *memberName = ivar_getName(var);
                //获取变量类型
                const char *memberType = ivar_getTypeEncoding(var);
                
                NSLog(@"%s----%s", memberName, memberType);
            }

//重新给属性赋值
//"_callDelegate" 为属性名
            Ivar var = class_getInstanceVariable([obj class], "_callDelegate");
            object_setIvar(obj, var, self);


获取类的所有属性

/**  
 *  获取类的所有属性  
 */  
+(void)showStudentClassProperties  
{  
    Class cls = [Student class];  
    unsigned int count;  
    while (cls!=[NSObject class]) {  
        objc_property_t *properties = class_copyPropertyList(cls, &count);  
        for (int i = 0; i<count; i++) {  
            objc_property_t property = properties[i];  
            NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property) encoding:NSUTF8StringEncoding];  
            NSLog(@"属性名==%@",propertyName);  
        }  
        if (properties){  
            //要释放  
           free(properties);  
        }  
    //得到父类的信息  
    cls = class_getSuperclass(cls);  
    }  
} 


获取类的所有方法

/**  
 *  获取类的所有方法  
 */  
+(void)showStudentClassMethods  
{  
    unsigned int count;  
    Class cls = [Student class];  
    while (cls!=[NSObject class]){  
        Method *methods = class_copyMethodList(cls, &count);  
        for (int i=0; i < count; i++) {  
            NSString *methodName = [NSString stringWithCString:sel_getName(method_getName(methods[i])) encoding:NSUTF8StringEncoding];  
            NSLog(@"方法名:%@ ", methodName);  
        }  
        if (methods) {  
             free(methods);  
        }  
        cls = class_getSuperclass(cls);  
    }  
     
}  


获取类的所有属性 做健值反射

/**  
 *  获取类的所有属性 做健值反射  
 */  
+(Student *)showStudentClassPropertiesToMapValueWithDic:(NSDictionary *)dic  
{  
    Student *stu = [[Student alloc] init];  
      
    Class cls = [Student class];  
    unsigned int count;  
    while (cls!=[NSObject class]) {  
        objc_property_t *properties = class_copyPropertyList(cls, &count);  
        for (int i = 0; i<count; i++) {  
            objc_property_t property = properties[i];  
            NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property) encoding:NSUTF8StringEncoding];  
            //得到属性名可以在这里做反射 反馈过来的dic 直接反射成一个model   
            /**  
             *  valueForKey: 是 KVC(NSKeyValueCoding) 的方法,在 KVC 里可以通过 property 同名字符串来获取对应的值  
             *  这里的dic 的key 与 stu 的属性名一一对应  
             * (MVC模式设计数据反射时候用到{类定义属性时候要和服务端反馈过来的字段一样})  
             */  
            id propertyValue = [dic valueForKey:propertyName];  
            if (propertyValue)  
                [stu setValue:propertyValue forKey:propertyName];//属性get set赋值  
            // NSLog(@"%@ = %@",propertyName,propertyValue);  
        }  
        if (properties){  
            free(properties);  
        }  
        //得到父类的信息  
        cls = class_getSuperclass(cls);  
    }  
    return stu;  
}  


判别这个属性是否具备get set方法

// 判别这个属性是否具备get set方法 (重要!以上都要添加这个判别)
NSString *propertySetMethod = [NSString stringWithFormat:@"set%@%@:", [[propertyName substringToIndex:1] capitalizedString]  ,[propertyName substringFromIndex:1]];
SEL selector = NSSelectorFromString(propertySetMethod);
if ([model respondsToSelector:selector])
{
    [model setValue:propertyValue forKey:propertyName];
}


高宽比例计算方法及等比高宽修改计算方法

假设:
高=G,宽=K,比例=B;

比例公式:
B= G / K;

等比修正公式:
如果改变宽度(K),则高度(G)计算公式应为:K * B;
如果改变高度(G),则宽度(K)计算公式应为:G / B;

代入值进行计算:
Size = 1024; (默认缩放值)
G = 111, K = 370;
B = G / K; (双精度浮点数)

修改宽度
K = 1024, G = K * B; (四舍五入取整)

修改高度
G = 1024, K = G / B; (四舍五入取整)

书籍宽高计算比例:
- (void)scale {
    NSInteger width = 1280;
    NSInteger height = 720;
    NSInteger sacle = getScale(width, height);
    NSLog(@"%ld :%ld",width / sacle, height / sacle);
}

NSInteger getScale(NSInteger w, NSInteger h) {
    if (w % h) {
        return gcd(h, w % h);
    } else {
        return h;
    }
}


判定是否设置了网络代理

需要导入框架CFNetwork,然后,这个方法是MRC的:需要添加-fno-objc-arc的flag,代码如下:

+ (BOOL)getProxyStatus {
    NSDictionary *proxySettings = NSMakeCollectable([(NSDictionary*)CFNetworkCopySystemProxySettings() autorelease]);
    NSArray *proxies = NSMakeCollectable([(NSArray*)CFNetworkCopyProxiesForURL((CFURLRef)[NSURL URLWithString:@"http://www.google.com"], (CFDictionaryRef)proxySettings) autorelease]);
    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;
    }
}


汉字转拼音

+ (NSString *)transform:(NSString *)chinese
{    
    //将NSString装换成NSMutableString
    NSMutableString *pinyin = [chinese mutableCopy];    
    //将汉字转换为拼音(带音标)    
    CFStringTransform((__bridgeCFMutableStringRef)pinyin, NULL, kCFStringTransformMandarinLatin, NO);    
    NSLog(@"%@", pinyin);    
    //去掉拼音的音标    
    CFStringTransform((__bridgeCFMutableStringRef)pinyin, NULL, kCFStringTransformStripCombiningMarks, NO);    
    NSLog(@"%@", pinyin);    
    //返回最近结果    
    return pinyin;
 }
- (WKWebView *)wk_WebView{
    if (!_wk_WebView) {
        // 禁止选择CSS
        NSString *css = @"body{-webkit-user-select:none;-webkit-user-drag:none;}";
        
        // CSS选中样式取消
        NSMutableString *javascript = [NSMutableString string];
        [javascript appendString:@"var style = document.createElement('style');"];
        [javascript appendString:@"style.type = 'text/css';"];
        [javascript appendFormat:@"var cssContent = document.createTextNode('%@');", css];
        [javascript appendString:@"style.appendChild(cssContent);"];
        [javascript appendString:@"document.body.appendChild(style);"];
        
        // javascript注入
        WKUserScript *noneSelectScript = [[WKUserScript alloc] initWithSource:javascript injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
        WKUserContentController *userContentController = [[WKUserContentController alloc] init];
        [userContentController addUserScript:noneSelectScript];
        WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
        config.preferences = [[WKPreferences alloc] init];
        config.userContentController = userContentController;
        [config.userContentController addScriptMessageHandler:self name:ScriptMessageHandlerName];
        //        [_wk_WebView evaluateJavaScript:ScriptMessageHandlerName completionHandler:^(id _Nullable response, NSError * _Nullable error) {
        //            NSLog(@"response: %@ error: %@", response, error);
        //            NSLog(@"call js alert by native");
        //        }];
        _wk_WebView = [[WKWebView alloc] initWithFrame:self.view.bounds
                                         configuration:config];
        _wk_WebView.UIDelegate = self;
        _wk_WebView.navigationDelegate = self;
        _wk_WebView.scrollView.bounces = NO;
        _wk_WebView.scrollView.contentInset = UIEdgeInsetsMake(0, 0, kNavgationHeight, 0);
        //侧滑
        _wk_WebView.allowsBackForwardNavigationGestures = YES;
        if (IOS_VERSION_10_OR_LATER) {
            _wk_WebView.scrollView.refreshControl = self.refreshControl;
        }
        // 添加KVO监听 //进度
        [_wk_WebView addObserver:self forKeyPath:ObserveWebKey_Progress options:NSKeyValueObservingOptionNew context:NULL];
    }
    return _wk_WebView;
}

获取CPU核数

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

推荐阅读更多精彩内容