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
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))
@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