剩余
    BOOL res1 = [(id)[NSObject class] isKindOfClass:[NSObject class]];
    BOOL res2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]];

    BOOL res3 = [(id)[UIViewController class] isKindOfClass:[UIViewController class]];
    BOOL res4 = [(id)[UIViewController class] isMemberOfClass:[UIViewController class]];
    //iskindOfClass 是这个类/子类的实例
    //isMemberofClass 是这个类的实例
    //[obj class]获取class指针的指向
    NSLog(@"%d**%d**%d**%d",res1,res2,res3,res4); //YES/NO/NO/NO
  • swift 的Swizzling实现方式是:定义一个静态方法a。在方法a中实现所有的方法交换,在app启动的方法中调用方法a。

dispatch_barrier_sync和dispatch_barrier_async的共同点: 1、都会等待在它前面插入队列的任务(1、2、3)先执行完 2、都会等待他们自己的任务(0)执行完再执行后面的任务(4、5、6)

dispatch_barrier_sync和dispatch_barrier_async的不共同点: 在将任务插入到queue的时候,dispatch_barrier_sync需要等待自己的任务(0)结束之后才会继续执行后面的任务4、5、6)

而dispatch_barrier_async将自己的任务(0)插入到queue之后,不会等待自己的任务结束,而是直接执行后面的任务4、5、6 所以,dispatch_barrier_async的不等待(异步)特性体现在将任务插入队列的过程,它的等待特性体现在任务真正执行的过程。

0 指定重复次数 指定10次 //queue 添加block的queur // index 带有参数的Block, index的作用是为了按执行的顺序区分各个Block

dispatch_apply(10, queue, ^(size_t index) {
    NSLog(@"%zu", index);
 });
NSLog(@"done");


###关于范型编程

T是Type

E是Element

E一般用来表示集合类型中的元素的类型,例如List接口的定义,public interface List extends Collection

###7.iphone适配

####7.1启动图lauchImage

640x960(4/4s)
640x1136(5/5s/5c)
750x1334(6/6s/7)
1242x2208(6 plus/7 plus)
1125*2436   (iphone X)

####7.2图标Icon

57*57
114*114
120*120
180*180

###8iPad适配

####8.1启动图LauchImage


768*1024(iPad)

1536*2048

2048*2732(iPad Pro)

####8.2图标Icon

72*72 (ipad)
144*144 (ipad Retina)
76*76 (ipad2& ipad mimi)
152*152 (ipad Retain
)

###9.iphone X 适配笔记

####9.1 启动图 使用xib 适配,可以保证iphoneX 上的刘海问题,需要的图片尺寸

375*812,
750*1624,
1125*2436
  ###11.#pragma clang diagnostic ingnored用法
 #pragma用法一,打分段注释
 #pragma用法二,处理部分编译器警告,就是让编译器忽略某些警告
 格式如下
#pragma clang diagnostic push  
#pragma clang diagnostic ignored "-相关命令"  
   // 你自己的代码  
#pragma clang diagnostic pop  
 将相关命令替换即可实现让编译器忽略不同类型警告的效果
 >方法弃用告警

“-Wdeprecated-delarations”


 >不兼容指针类型

"-Wincompatible-pointer-types"


 >循环引用

“-Warc-retain-cycles”


 >未使用变量

"-Wunused-variable"


###12.__attribute__((attribute-list)) 
GUN C特色之一,在iOS中应用广泛,主要用于设置函数属性(Function Attribute )、变量属性(Variable Attribute )和类型属性(Type Attribute ).
目的是在用户使用这些某些的api时,根据不同的attribute-list,编译器会给出不同的警告,

>1.格式化检查__attribute__((format())):
检查的是格式化字符串与“...”的匹配问题

如:attribute((format(NSString, F, A))) 意思是参数的第F位是格式化字符串,从A位开始我们开始检查 A.F都是从1开始

实例

//打印函数 NSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2)

//NS_FORMAT_FUNCTION定义如下

#define NS_FORMAT_FUNCTION(F,A) attribute((format(NSString, F, A)))

结果就是检查NSLog“,”分割开的“format”字符串和“...”的匹配情况。

用于修饰属性的
1.deprecated:弃用属性
> __attribute__((deprecated))
>
>__attribute__((deprecated(s)))

2.aligned(m)强制编译器使变量的内存空间m字节对齐



用于修饰函数的
1:noreturn:函数永不返回
>__attribute__((noreturn))
  • (void) attribute((noreturn)) networkRequestThreadEntryPoint:(id)__unused object { do {
      @autoreleasepool {
          [[NSRunLoop currentRunLoop] run];
      }
    
    } while (YES); }
    2.__attribute__((constructor)) 。表示函数自动在main函数之前执行
    3.__attribute__((destructor)) 。表示函数自动在main函数之后执行
    4.const:用于数值型的函数参数,表示函数结果址只依赖于参数,如果参数相同则直接返回第一次的执行结果即可
    
    int attribute((const)) add(int x) { printf("%s(%d)\n", FUNCTION, x); return x + 1; } add(10); add(10); //第二次会直接返回
    5.clearup离开作用域之后执行指定的方法,比如清理
    6.__attribute__((nonnull(...))):对函数参加进行NULL检查
    
    extern void my_memcpy_3 (void dest, const void src, const void other, size_t len) attribute((nonnull (1, 2, 3))); //意思是函数的第1.2,3,参数都不可以为NULL(下标从1开始) ``` 通用的 1.unavailable:不可用,使用会报错

    attribute((unavailable))

2.availability:函数或属性的可以使用的版本

attribute((availability(macosx,introduced=m,deprecated=n)))

m 引入的版本,n 过时的版本

#内存对齐详解 http://www.cnblogs.com/dolphin0520/archive/2011/09/17/2179466.html aligned(m)强制编译器使变量的内存空间m字节对齐,就是所谓的内存对齐

##内存对齐定义 从理论是讲,对于任何变量的访问都可以从任何地址开始访问,但实际上访问特定类型的变量只能在特定的地址访问,这就需要变量按一定的规则排列,这就是内存对齐

##内存对齐原因

1某些平台只能在特定的地址处访问特定类型的数据

2.提高读取数据的速度。比如有的平台从偶地址读取数据,如果变量也是从偶地址单元存放,在仅需要一个读取周期就可读取该变量;如果变量是从奇地址处存放,则需要2个读取周期才能读取到该变量

##结构体内存对齐的要求如下

1.结构体每个成员相对结构体首地址的偏移量(offset)是对齐参数的整数倍。

2.结构体变量总占用空间大小是对齐参数的整数倍,

对齐参数有2个,

1是变量自身的对齐参数,也就是变量的sizeof大小

2时编译器的对齐参数,就是m字节对齐的中m。默认时8

所以对与原则一(相对于首地址的偏移量)的对齐参数取2个对齐参数中的较小者即可

原则二:(结构体的整体大小的对齐参数)取的是结构体中所有参数的对齐参数的最大值和编译器对齐参数m二者的小者作为对齐参数。 oc默认的对齐参数为4, 如果显示的使用attribute((aligned(m))),设置是m,结构体变量总占用空间大小是m的整数倍。

typedef struct node3
{
    int a;
    short b;
    static int c;
}S3;

注意只有c++的结构体中才有静态数据成员,而且静态数据成员会被存放到静态数据去,不计如结构体大小中

对于变量a,自身对齐参数4.默认对齐参数8,故最终对齐参数为4,为齐分配4个字节的空间,相对于结构体的首地址offset为0,可以被4整除

对于变量b,自身对齐参数2,默认对齐参数8,故最终对齐参数为2,为齐分配2个字节的空间,相对首地址的offset为4,可以被2整除,

对于变量c不计算在内

此时大小为4+2 = 6. 变量自身最大对齐参数为4,默认对齐参数4,故整体大小对齐参数为8, 大小为6+2 = 8; 实例二

struct q2{
    char d;//1.自身对齐参数1,默认对齐参数8,取1,分配1个字节,offset为0/1=0.
    int a;//4 //自身对齐参数1,默认对齐参数8,取4.分配4个字节offset为1,不能整除,故不去为4.然后自身分配4个字节,此时大小为(1+(3)+4)= 8
    short c; //2//自身对齐参数2,默认对齐参数8,取2.分配2个字节,offset为8./2= 4.ok
    //此时大小为1+(3)+4+2 = 10
    char b; //1自身对齐参数1,默认对齐参数8,取1.分配1个字节,offset为10/1 = 10.ok
    //此时大小为1+(3)+4+2+1 = 11,
    //属性最大对齐参数为4.默认对齐参数为4.取min为4.大小为12


}  qq2;//
最后一行修改为
} __attribute__((aligned(8))) qq2
//属性最大对齐参数为4.编译器对齐参数为8.取max为8,大小为16
chapter-9
JSRUN前端笔记, 是针对前端工程师开放的一个笔记分享平台,是前端工程师记录重点、分享经验的一个笔记本。JSRUN前端采用的 MarkDown 语法 (极客专用语法), 这里属于IT工程师。