美文网首页
iOS实用小技巧

iOS实用小技巧

作者: 不会唱歌呢丶 | 来源:发表于2018-08-01 10:16 被阅读8次

    iOS实用小技巧 Objective-C

    1.让Xcode的控制台支持LLDB类型的打印

    因为在Xcode断点调试的时候, 在控制台输入 po self.view.frame 输出错误
    如图 :


    image.png

    进入正题

    打开终端输入三条命令:

    1. touch ~/.lldbinit
    2. echo display @import UIKit >> ~/.lldbinit
    3. echo target stop-hook add -o \"target stop-hook disable\" >> ~/.lldbinit
    

    重新运行项目(不用重启Xcode也可以),看如下图~~

    image.png

    就代表成功啦

    那么现在我们继续在控制台输入po self.view.frame
    成功了!如果po指令是一个id类型也可以正常打印。是不是感觉方便很多呀?

    如何删除?
    其实很简答, 看第一条命令touch ~/.lldbinit,就是在根目录下创建了一个隐藏文件.lldbinit,然后删除这个文件就搞定啦。
    打开终端然后,在终端输入 :

    rm ~/.lldbinit 
    

    命令即可.

    2.用宏定义检测block是否可用!

    #define BLOCK_EXEC(block, ...) if (block) { block(__VA_ARGS__); };
    
    // 宏定义之前的用法
    /*
     if (completionBlock){
     
        completionBlock(arg1, arg2);
     
     }
     */
    
    // 宏定义之后的用法
    BLOCK_EXEC(completionBlock, arg1, arg2);
    

    3.给SDK头文件加权限

    如果您是从DMG安装Xcode的,看看这个技术通过Joar Wingfors,以避免通过保留所有权,权限和硬链接意外修改SDK头:

    $ sudo ditto /Volumes/Xcode/Xcode.app /Applications/Xcode.app
    

    4.检查void *实例变量(from mattt)

    对于逆向工程的目的,但是这是可以看的对象实例变量。它通常很容易用valueForKey这样获取。

    还有一个情况下,它不能用valueForKey获取,虽然:当这个变量是void *类型。

    @interface MPMoviePlayerController : NSObject <mpmediaplayback>
    {
        void *_internal;    // 4 = 0x4
        BOOL _readyForDisplay;  // 8 = 0x8
    }</mpmediaplayback>
    

    用底层方式来访问

    id internal = *((const id*)(void*)((uintptr_t)moviePlayerController + sizeof(Class)));
    

    不要使用这段代码,它的非常危险的。仅使用于逆向工程!

    5.使用ARC和不使用ARC(from 夏夏)**

    //使用ARC和不使用ARC`
    #if __has_feature(objc_arc)
    //compiling with ARC
    #else
    // compiling without ARC
    #endif
    

    6.读取本地图片(from 夏夏)

    #define LOADIMAGE(file,ext) [UIImage imageWithContentsOfFile:[NSBundle mainBundle]pathForResource:file ofType:ext]
    //定义UIImage对象`
    #define IMAGE(A) [UIImage imageWithContentsOfFile:[NSBundle mainBundle] pathForResource:A ofType:nil]`
    

    7.iOS图片内存优化

    imageNamed读取图片的方法,会缓存在内存中,所以较大的图片,还是用imageWithContentsOfFile。
    Tip1:.xcassets里的图片无法用imageWithContentsOfFile读取;
    Tip2:imageWithContentsOfFile读取图片需要加文件后缀名如png,jpg等;

    8.在控制台里打印controller的层级

    po [UIViewController _printHierarchy]
    

    9.动态调用block(黑魔法)

    //定义一个block
    id (^testBlock)(NSString *string,NSArray *array) = ^id(NSString *string,NSArray *array) {
        NSLog(@"param:--%@--%@",string,array);
        return string;
    };
    
    // _Block_signature  是iOS的私有api
    const char * _Block_signature(void *);
    const char * signature = _Block_signature((__bridge void *)(testBlock));
    
    
    NSMethodSignature *methodSignature = [NSMethodSignature signatureWithObjCTypes:signature];
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature];
    [invocation setTarget:testBlock];
    
    
    NSString *string = @"string";
    [invocation setArgument:&string atIndex:1];
    
    NSArray *array = @[@"xx",@"oo"];
    [invocation setArgument:&array atIndex:2];
    [invocation invoke];
    
    id returnValue;
    [invocation getReturnValue:&returnValue];
    NSLog(@"returnValue : %@",returnValue)
    

    相关文章

      网友评论

          本文标题:iOS实用小技巧

          本文链接:https://www.haomeiwen.com/subject/vkdlvftx.html