wq's blogs

王乾


  • 首页

  • 分类

  • 标签

  • 归档

如何让自己的类用 copy 修饰符?

发表于 2019-12-16 | 分类于 iOS开发技巧

如何让自己的类用 copy 修饰符?

 NSArray *tempArray = @[@"1",@"2"];
NSMutableArray *mutableCopyMuArray = [tempArray mutableCopy];

// tempArray==0x600002649ce  mutableCopyMuArray==0x600002649ce0
// 深copy tempArray 和 mutableCopyMuArray是完全不同的变量
NSLog(@"tempArray==%p,mutableCopyMuArray==%p",tempArray,mutableCopyMuArray);


 WQUser *user = [[WQUser alloc] initWithName:@"lbj" age:35];
/*
 WQUser自己新建的类不具备copy功能,程序会crash
 声明NSCopying并且实现协议方法后,新建的类会具备copy功能
 user==0x600002f7b400,copyUser==0x600002f7b3e0,copy出来完全不同的变量
 */

WQUser *copyUser = [user copy];

NSLog(@"user==%p,copyUser==%p",user,copyUser);
阅读全文 »

关键字

发表于 2019-12-10 | 分类于 iOS开发技巧

什么情况使用 weak 关键字,相比 assign 有什么不同?

什么情况使用 weak 关键字?

  1. 在 ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用 weak 来解决,比如: delegate 代理属性
  2. 自身已经对它进行一次强引用,没有必要再强引用一次,此时也会使用 weak

不同点:

  1. weak 此特质表明该属性定义了一种“非拥有关系” (nonowning relationship)。为这种属性设置新值时,设置方法既不保留新值,也不释放旧值。此特质同assign类似, 然而在属性所指的对象遭到摧毁时,属性值也会清空(nil out)。 而 assign 的“设置方法”只会执行针对“纯量类型” (scalar type,例如 CGFloat 或 NSlnteger 等)的简单赋值操作。
  2. assign 可以用非 OC 对象,而 weak 必须用于 OC 对象
阅读全文 »

Go语言常量和模拟枚举

发表于 2019-11-22 | 分类于 Golang基础

1、常量和const关键字

特点:

  • 常量使用关键字 const 定义,用于存储不会改变的数据,常量是在编译时被创建的,即使定义在函数内部也是如此。
  • const定义类型只有基本数据类型。string bool 数字(整型、浮点型、复数)
  • 常量的值必须是能够在编译时就能够确定的,可以在其赋值表达式中涉及计算过程,但是所有用于计算的值必须在编译期间就能获得。
阅读全文 »

mac下升级ruby环境版本

发表于 2019-11-18 | 分类于 GitHub

在ios开发中会经常使用到cocoapods来管理第三方框架,在安装cocoapods的时候会涉及到ruby环境,有时候会因为版本过低会导致安装失败,本文主要讲一下如何升级ruby环境

阅读全文 »

Golang疑问

发表于 2019-11-14 | 分类于 Golang基础
1、变量逃逸分析,不太明白变量是在栈、堆上?

Golang语言指针

发表于 2019-11-13 | 分类于 Golang基础

从指针获取指针指向的值

名词:指针类型、指针地址、&、*

//  ptr-pointer (既指针)得缩写

var house string = "777"

ptr := &house // &取地址操作符,对字符串取地址,将指针保存到变量ptr中

fmt.Printf("ptr type: %T\n", ptr)    // 指针类型为 *string
fmt.Printf("ptr address: %p\n", ptr) // 指针地址,指向对象在内存中存放的位置。每次运行都会发生变化。

value := *ptr                         // *取值操作符,对指针进行取值操作
fmt.Printf("value type: %T\n", value) // 打印为string
fmt.Printf("value address: %s\n", value)
阅读全文 »

Go语言基本语法

发表于 2019-09-19 | 分类于 Golang基础

Go语言类型的本质

内置类型

整型类型、浮点类型、字符串类型和布尔类型,对这些值进行增加或者删除的时候,会创建一个新值。当把这些类型的值传递给方法或者函数时,应该传递一个对应值的副本。

引用类型

结构类型

疑问点:
1、这些值进行增加或者删除的时候,会创建一个新值
2、引用类型、结构类型没看

阅读全文 »

Hexo无法显示本地图片

发表于 2019-08-28 | 分类于 工具

1、插件安装与配置

首先我们需要安装一个图片转化的插件,这个插件的名字叫 hexo-asset-image

npm install https://github.com/CodeFalling/hexo-asset-image --save

但是这个插件的内容需要修改【不然可能会出Bug】
打开/node_modules/hexo-asset-image/index.js,将内容更换为下面的代码

'use strict';
var cheerio = require('cheerio');

// http://stackoverflow.com/questions/14480345/how-to-get-the-nth-occurrence-in-a-string
function getPosition(str, m, i) {
  return str.split(m, i).join(m).length;
}

var version = String(hexo.version).split('.');
hexo.extend.filter.register('after_post_render', function(data){
  var config = hexo.config;
  if(config.post_asset_folder){
    var link = data.permalink;
if(version.length > 0 && Number(version[0]) == 3)
   var beginPos = getPosition(link, '/', 1) + 1;
else
   var beginPos = getPosition(link, '/', 3) + 1;
// In hexo 3.1.1, the permalink of "about" page is like ".../about/index.html".
var endPos = link.lastIndexOf('/') + 1;
link = link.substring(beginPos, endPos);

var toprocess = ['excerpt', 'more', 'content'];
for(var i = 0; i < toprocess.length; i++){
  var key = toprocess[i];

  var $ = cheerio.load(data[key], {
    ignoreWhitespace: false,
    xmlMode: false,
    lowerCaseTags: false,
    decodeEntities: false
  });

  $('img').each(function(){
    if ($(this).attr('src')){
        // For windows style path, we replace '\' to '/'.
        var src = $(this).attr('src').replace('\\', '/');
        if(!/http[s]*.*|\/\/.*/.test(src) &&
           !/^\s*\//.test(src)) {
          // For "about" page, the first part of "src" can't be removed.
          // In addition, to support multi-level local directory.
          var linkArray = link.split('/').filter(function(elem){
            return elem != '';
          });
          var srcArray = src.split('/').filter(function(elem){
            return elem != '' && elem != '.';
          });
          if(srcArray.length > 1)
            srcArray.shift();
          src = srcArray.join('/');
          $(this).attr('src', config.root + link + src);
          console.info&&console.info("update link as:-->"+config.root + link + src);
        }
    }else{
        console.info&&console.info("no src attr, skipped...");
        console.info&&console.info($(this));
    }
  });
  data[key] = $.html();
}
  }
});

最后打开_config.yml文件,修改下述内容

post_asset_folder: true

2、相对路径引用的标签插件

存档页和主页不能使用和文章内容中的常规语法来引用图片。
比如说:当你打开文章资源文件夹功能后,你把一个 example.jpg 图片放在了你的资源文件夹中,如果通过使用相对路径的常规 markdown 语法 ![](/example.jpg,它将 不会 出现在首页上。(但是它会在文章中按你期待的方式工作)
正确的引用图片方式是使用下列的标签插件而不是 markdown :

{% asset_img example.jpg This is an example image %}

iPhone和iPad分辨率

发表于 2019-08-22 | 分类于 iOS开发技巧

iPhone和iPad分辨率

iPhone

iPad

iPad Air

iPad Pro

iPad Mini

iTouch

判断设备类型

#import <sys/utsname.h>

+ (NSString *)deviceType
{
struct utsname systemInfo;
uname(&systemInfo);
NSString *platform = [NSString stringWithCString:systemInfo.machine encoding:NSASCIIStringEncoding];

//------------------------------iPhone---------------------------
if ([platform isEqualToString:@"iPhone1,1"]) return @"iPhone 2G";
if ([platform isEqualToString:@"iPhone1,2"]) return @"iPhone 3G";
if ([platform isEqualToString:@"iPhone2,1"]) return @"iPhone 3GS";
if ([platform isEqualToString:@"iPhone3,1"] ||
    [platform isEqualToString:@"iPhone3,2"] ||
    [platform isEqualToString:@"iPhone3,3"]) return @"iPhone 4";
if ([platform isEqualToString:@"iPhone4,1"]) return @"iPhone 4S";
if ([platform isEqualToString:@"iPhone5,1"] ||
    [platform isEqualToString:@"iPhone5,2"]) return @"iPhone 5";
if ([platform isEqualToString:@"iPhone5,3"] ||
    [platform isEqualToString:@"iPhone5,4"]) return @"iPhone 5c";
if ([platform isEqualToString:@"iPhone6,1"] ||
    [platform isEqualToString:@"iPhone6,2"]) return @"iPhone 5s";
if ([platform isEqualToString:@"iPhone7,2"]) return @"iPhone 6";
if ([platform isEqualToString:@"iPhone7,1"]) return @"iPhone 6 Plus";
if ([platform isEqualToString:@"iPhone8,1"]) return @"iPhone 6s";
if ([platform isEqualToString:@"iPhone8,2"]) return @"iPhone 6s Plus";
if ([platform isEqualToString:@"iPhone8,4"]) return @"iPhone SE";
if ([platform isEqualToString:@"iPhone9,1"] ||
    [platform isEqualToString:@"iPhone9,3"]) return @"iPhone 7";
if ([platform isEqualToString:@"iPhone9,2"] ||
    [platform isEqualToString:@"iPhone9,4"]) return @"iPhone 7 Plus";
if ([platform isEqualToString:@"iPhone10,1"] ||
    [platform isEqualToString:@"iPhone10,4"]) return @"iPhone 8";
if ([platform isEqualToString:@"iPhone10,2"] ||
    [platform isEqualToString:@"iPhone10,5"]) return @"iPhone 8 Plus";
if ([platform isEqualToString:@"iPhone10,3"] ||
    [platform isEqualToString:@"iPhone10,6"]) return @"iPhone X";
if ([platform isEqualToString:@"iPhone11,8"]) return @"iPhone XR";
if ([platform isEqualToString:@"iPhone11,2"]) return @"iPhone XS";
if ([platform isEqualToString:@"iPhone11,4"] ||
    [platform isEqualToString:@"iPhone11,6"]) return @"iPhone XS Max";

//------------------------------iPad--------------------------
if ([platform isEqualToString:@"iPad1,1"]) return @"iPad";
if ([platform isEqualToString:@"iPad2,1"] ||
    [platform isEqualToString:@"iPad2,2"] ||
    [platform isEqualToString:@"iPad2,3"] ||
    [platform isEqualToString:@"iPad2,4"]) return @"iPad 2";
if ([platform isEqualToString:@"iPad3,1"] ||
    [platform isEqualToString:@"iPad3,2"] ||
    [platform isEqualToString:@"iPad3,3"]) return @"iPad 3";
if ([platform isEqualToString:@"iPad3,4"] ||
    [platform isEqualToString:@"iPad3,5"] ||
    [platform isEqualToString:@"iPad3,6"]) return @"iPad 4";
if ([platform isEqualToString:@"iPad4,1"] ||
    [platform isEqualToString:@"iPad4,2"] ||
    [platform isEqualToString:@"iPad4,3"]) return @"iPad Air";
if ([platform isEqualToString:@"iPad5,3"] ||
    [platform isEqualToString:@"iPad5,4"]) return @"iPad Air 2";
if ([platform isEqualToString:@"iPad6,3"] ||
    [platform isEqualToString:@"iPad6,4"]) return @"iPad Pro 9.7-inch";
if ([platform isEqualToString:@"iPad6,7"] ||
    [platform isEqualToString:@"iPad6,8"]) return @"iPad Pro 12.9-inch";
if ([platform isEqualToString:@"iPad6,11"] ||
    [platform isEqualToString:@"iPad6,12"]) return @"iPad 5";
if ([platform isEqualToString:@"iPad7,1"] ||
    [platform isEqualToString:@"iPad7,2"]) return @"iPad Pro 12.9-inch 2";
if ([platform isEqualToString:@"iPad7,3"] ||
    [platform isEqualToString:@"iPad7,4"]) return @"iPad Pro 10.5-inch";

//------------------------------iPad Mini-----------------------
if ([platform isEqualToString:@"iPad2,5"] ||
    [platform isEqualToString:@"iPad2,6"] ||
    [platform isEqualToString:@"iPad2,7"]) return @"iPad mini";
if ([platform isEqualToString:@"iPad4,4"] ||
    [platform isEqualToString:@"iPad4,5"] ||
    [platform isEqualToString:@"iPad4,6"]) return @"iPad mini 2";
if ([platform isEqualToString:@"iPad4,7"] ||
    [platform isEqualToString:@"iPad4,8"] ||
    [platform isEqualToString:@"iPad4,9"]) return @"iPad mini 3";
if ([platform isEqualToString:@"iPad5,1"] ||
    [platform isEqualToString:@"iPad5,2"]) return @"iPad mini 4";

//------------------------------iTouch------------------------
if ([platform isEqualToString:@"iPod1,1"]) return @"iTouch";
if ([platform isEqualToString:@"iPod2,1"]) return @"iTouch2";
if ([platform isEqualToString:@"iPod3,1"]) return @"iTouch3";
if ([platform isEqualToString:@"iPod4,1"]) return @"iTouch4";
if ([platform isEqualToString:@"iPod5,1"]) return @"iTouch5";
if ([platform isEqualToString:@"iPod7,1"]) return @"iTouch6";

//------------------------------Samulitor-------------------------------------
if ([platform isEqualToString:@"i386"] || 
    [platform isEqualToString:@"x86_64"]) return @"iPhone Simulator";

return @"Unknown";

}

btw:所有设备型号官网地址: https://www.theiphonewiki.com/wiki/Models

GOROOT,GOPATH,GOBIN,project目录

发表于 2018-09-12 | 分类于 Golang基础

我们接下来一个一个来看关于Go语言中的三个目录的详细解释
先通过go env查看go的环境变量(我这里是mac的环境,所以可能和你的不同)

wangqiandeMacBook-Pro:~ wangqian$ go env
GOARCH="amd64"
GOBIN="/Users/wangqian/Desktop/Golang_Study/bin"
GOCACHE="/Users/wangqian/Library/Caches/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/wangqian/Desktop/Golang_Study"
GOPROXY=""
GORACE=""
GOROOT="/usr/local/go"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
GCCGO="gccgo"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/zm/zrfg_g0x7f970pp27h3whjd00000gn/T/go-build047476467=/tmp/go-build -gno-record-gcc-switches -fno-common"

GOROOT

其实就是golang 的安装路径
当你安装好golang之后其实这个就已经有了,Mac环境下默认为/usr/local/go

GOPATH

go命令依赖的一个重要环境变量:$GOPATH

其实可以把这个目录理解为工作目录,我个人定义的目录是:
GOPATH=”/Users/wangqian/Desktop/Golang_Study”
当然这个目录是需要添加到环境变量中的

其中Golang_Study文件下包括

-- bin 箱子、容器,golang编译可执行文件存放路径
-- src 标准要求代码(Standard Requirement Code)源码路径。按照golang默认约定,go run,go install等命令的当前工作路径(即在此路径下执行上述命令
-- pkg package包装 golang编译包时,生成的.a文件存放路径

GOBIN

首先先看一下我的目录结构

123
王乾

王乾

在成为最厉害最厉害最厉害的道路上。

27 日志
4 分类
5 标签
RSS
GitHub E-Mail
© 2020 王乾