hexo

sudo -s 终端全部使用管理员的方式运行

Init a new project

$ hexo init

Create a new post

$ hexo new "My New Post"

More info: Writing

Create a new draft

$ hexo new draft "draft Post"

Run server

$ hexo server

如果端口被占用了 可以使用-p 重设端口

More info: Server

Generate static files

$ hexo generate

More info: Generating

Deploy to remote sites

$ hexo deploy

More info: Deployment

生成纯页面

$ hexo new page "pageName"

在yml配置文件中可以添加这行代码

#包含和剔除
include:
  - .nojekyll
exclude:
  - .DS_Store

2019/4/11 posted in  其它

检查无用代码

简便的方法是使用appcode进行分析

在appcode中打开代码,并选择code->inspect code就可以进行静态分析。

分析完之后,我们可以在unused code里看到所有的无用代码。如下图所示。

接下来,我和你说一下这些无用代码的主要类型。

  • 无用类:Unused class 是无用类,Unused import statement 是无用类引入声明,Unused property 是无用的属性;
  • 无用方法:Unused method 是无用的方法,Unused parameter 是无用参数,Unused instance variable 是无用的实例变量,Unused local variable 是无用的局部变量,Unused value 是无用的值;
  • 无用宏:Unused macro 是无用的宏。
  • 无用全局:Unused global declaration 是无用全局声明。

看似 AppCode 已经把所有工作都完成了,其实不然。下面,我再和你列举下 AppCode 静态检查的问题:

  • JSONModel 里定义了未使用的协议会被判定为无用协议;
  • 如果子类使用了父类的方法,父类的这个方法不会被认为使用了;
  • 通过点的方式使用属性,该属性会被认为没有使用;
  • 使用 performSelector 方式调用的方法也检查不出来,比如 self performSelector:@selector(arrivalRefreshTime);
  • 运行时声明类的情况检查不出来。比如通过 NSClassFromString 方式调用的类会被查出为没有使用的类,比如 layerClass = NSClassFromString(@“SMFloatLayer”)。还有以 [[self class] accessToken] 这样不指定类名的方式使用的类,会被认为该类没有被使用。像 UITableView 的自定义的 Cell 使用 registerClass,这样的情况也会认为这个 Cell 没有被使用。

define RW_INITIALIZED (1<<29)

bool isInitialized() {
return getMeta()->data()->flags & RW_INITIALIZED;
}

2019/3/20 posted in  iOS

Debug 技巧(汇编层面)

在Xcode中调试代码 一般都使用po 和 p命令,但是还是一种方法就是进入到汇编语言 debug。这时候就会用到了 lldb 的一个指令叫寄存器读。

register read // 寄存器读

1.怎么开启汇编语言 debug

首先Xcode 菜单栏 debug 如下图所示选择 debug workflow

屏幕快照 2019-03-27 上午10.43.57

然后选择然后选择第一项总是显示汇编窗口

屏幕快照 2019-03-27 上午10.47.06

2.那么进入到指定的汇编断点之后应该如何打印信息呢

屏幕快照 2019-03-27 上午10.49.12

使用register read 就会把具体的信息给打印出来
如下所示,还可以具体使用 register read rsp 等打印出来逐条的信息,不过意义不是特别大,因为register read已经可以把所有信息打印出来

(lldb) register read
General Purpose Registers:
       rax = 0x0fc228d768f90060
       rbx = 0x00000001088ebc05  "count"
       rcx = 0x0000000000000111
       rdx = 0x00000001167855c0  dyld`_main_thread
       rdi = 0x00007fcf0bc0b300
       rsi = 0x00000001074a8971  "sayHello"
       rbp = 0x00007ffee87549f0
       rsp = 0x00007ffee8754970
        r8 = 0x000000010a5203a0  libsystem_pthread.dylib`_pthread_keys
        r9 = 0x0000000000000040
       r10 = 0x0000000000000000
       r11 = 0x0000000000000202
       r12 = 0x0000000000000018
       r13 = 0x00007fcf0bc0b300
       r14 = 0x000000010c37b9e4  UIKitCore`_UIApplicationLinkedOnVersion
       r15 = 0x0000000107ddbd80  libobjc.A.dylib`objc_msgSend
       rip = 0x00000001074a8341  ExchangeMethod`-[ViewController mwviewDidLoad] + 465 at ViewController.m:87
    rflags = 0x0000000000000206
        cs = 0x000000000000002b
        fs = 0x0000000000000000
        gs = 0x0000000000000000

利用image list命令列出所有image,第一个image就是我们APP的偏移值,也就是内存地址。

2019/1/20 posted in  iOS

Git提交代码issue

问题①:

fatal:unable to access 'https://github.com/xxx/xxx.git' OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com 443
解决方法:
env命令设置GIT_SSL_NO_VERIFY环境变量为”ture”,并同时调用正常的git clone命令 env GIT_SSL_NO_VERIFY=true git clone https://github.com/xxx/xxx.git     
当你通过HTTPS访问Git远程仓库,如果服务器的SSL证书未经过第三方机构签署,那么Git就会报错。在克隆完毕的仓库中还需要将http.sslVerify设置为”false”。完整的命令如下:    
git config http.sslVerify "false"、

问题②:

Failed to connect to 127.0.0.1 port 1080: Connection refused
查询是否使用代理:git config --global http.proxy 
取消代理:git config --global --unset http.proxy
解决方法:
终端走代理,在终端中直接运行命令
export http_proxy=http://proxyAddress:port
这个办法的好处是简单直接,并且影响面很小(只对当前终端有效,退出就不行了)。

如果你用的是ss代理,在当前终端运行以下命令,那么wget curl 这类网络命令都会经过ss代理
export ALL_PROXY=socks5://127.0.0.1:1080
2019/1/11 posted in  其它

通讯录排序

苹果提供的排序方法

NSArray *stringArr = @[@"我们",@"我的", @"重点", @"重庆",  @"三"]; 
NSArray *result = [stringArr sortedArrayUsingSelector:@selector(localizedCompare:)];

字典当中的keyvalue 可以一个键对应一个数组。

对数据进行排列按首字母进行分组

这是苹果的方法

    
    for ( modelAgreementCitizenItem *model in modelArr) {
        //获取汉子的首字母
        //把中文转拼音
        
        NSMutableString *ms = [[NSMutableString alloc] initWithString:[model patientName]];
        if (CFStringTransform((__bridge CFMutableStringRef)ms, 0, kCFStringTransformMandarinLatin, NO)) {
            NSLog(@"Pingying: %@", ms);
        }
        if (CFStringTransform((__bridge CFMutableStringRef)ms, 0, kCFStringTransformStripDiacritics, NO)) {
            NSLog(@"Pingying: %@", ms);
        }
        NSString *firstString = [[ms substringToIndex:1] uppercaseString];
        
        
        NSMutableArray * arr = [self.nameDic objectForKey:firstString];
        if (arr) {
            [arr addObject:model];
        }else{//如果没有 则需要创建一个添加到里面
            [self.nameDic setObject:[@[model] mutableCopy] forKey:firstString];
        }
        
    }
    
}

这个方法使用起来比较慢 耗时较长

    
    NSMutableArray *array = [[NSMutableArray alloc] init];
    if(self.indexArr.count){
        [self.indexArr removeAllObjects];
    }
    
    for(int i='A';i<='Z';i++)
    {
        NSMutableArray *rulesArray = [[NSMutableArray alloc] init];
        
        NSString *str1=[NSString stringWithFormat:@"%c",i];
        for(int j=0;j<modelArr.count;j++)
        {
            modelAgreementCitizenItem *model = [modelArr objectAtIndex:j];  //这个model 是我自己创建的 里面包含用户的姓名 手机号 和 转化成功后的首字母
            
            if([[NSString getFirstLetter:model.patientName] isEqualToString:str1])
            {
                [rulesArray addObject:model];    //把首字母相同的人物model 放到同一个数组里面
                [modelArr removeObject:model];   //model 放到 rulesArray 里面说明这个model 已经拍好序了 所以从总的modelArr里面删除
                j--;
                
            }else{
                
            }
        }
        if (rulesArray.count !=0) {
            [array addObject:rulesArray];
            [self.indexArr addObject:[NSString stringWithFormat:@"%c",i]]; //把大写字母也放到一个数组里面
        }
    }
    
    if (modelArr.count !=0) {
        [array addObject:modelArr];
        [self.indexArr addObject:@"#"];  //把首字母不是A~Z里的字符全部放到 array里面 然后返回
    }
    
    return array;
    
}



2019/1/10 posted in  iOS

怎么选购二手房

  1. 选择一个靠谱的中介
  2. 调查房源所属人
  3. 周边的配套是否完善
  4. 还有房源是不是有抵押
  5. 调查小区的基本情况
  6. 物业管理 水电 煤气 卫生 车位 安保
  7. 调查房子之前有没有发生过什么忌讳的事情
  8. 观察水压 观察电线走线是否合理 煤气线路
  9. 不同的时间看看社区的人的人来人往
  10. 房屋的内部结构(有没有改动过房屋的内部结构)
  11. 户型是否合理 暗厅 采光不好的问题
  12. 是否有漏水的现象
2018/12/30 posted in  其它

UISearchbar 自定义搜索图标失真

关于Searchbar设置搜索图标的问题
因为这个大小在iOS中是固定的14*14
如果UI给的切图不是这个尺寸就会出现失真的情况(ps:因为视图的默认contentMode是UIViewContentModeScaleToFill)
网上有的方法一般是设置一个继承自UITextfield的searchBar
去修改SearchBar的leftView。

UIImageView *searchIcon = [[UIImageView alloc] init];
searchIcon.image = [UIImage imageNamed:@"searchbar_textfield_search_icon"];
searchIcon.contentMode = UIViewContentModeCenter;        searchIcon.size = CGSizeMake(14, 14);
self.leftView = searchIcon;
self.leftViewMode = UITextFieldViewModeAlways;

但是其实完全可以便利UISearchBar的子视图拿到textField
再去设置textField.leftView.contendMode即可

其实系统方法
[xxxbar setImage:forSearchBarIcon:state];
内部就是设置了textField的leftView

2018/12/21 posted in  iOS

dispatch_semaphore_t 信号量

dispatch_semaphore_t 一种计算的信号量
dispatch_semaphore_create 创建一个数值的信号量
dispatch_semaphore_signal 对指定的信号量进行增加1

dispatch_semaphore_wait 会使传入的信号量减1,如果返回的值为0说明有任务进行中就阻碍当前的线程,如果返回的值大于0,就代表当前的线程当中没有任务再执行,就接着执行下面的任务。

用这个可以起到顺序执行异步任务的功效。
如果后一步的执行需要前一步执行完拿到结果才行的话,这也是一种异步顺序执行的方案。

- (void)viewDidLoad {
    [super viewDidLoad];
    
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [self task:@"task one starting"];
        dispatch_semaphore_signal(semaphore);
    });
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [self task:@"task two starting"];
        dispatch_semaphore_signal(semaphore);
    });
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [self task:@"task three starting"];
        dispatch_semaphore_signal(semaphore);
    });
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)task:(NSString *)taskName{
    NSLog(@"%@",taskName);
    sleep(1);
}

先执行dispatch_semaphore_wait 然后发现线程任务还在进行,就开始堵塞当前任务的线程,等待dispatch_async内部执行完成信号量+1才会继续下面的执行。

2018/12/15 posted in  iOS