黑魔法
2017-11-27 本文已影响8人
Vijay_
非空代码块
NS_ASSUME_NONNULL_BEGIN
@interface person : NSObject
//在此处的所有成员属性和方法都是非空的
@end
NS_ASSUME_NONNULL_END
kCFNull是不同于nil Nil Null(三者一样)的kCFNull是NSNull的单例指针 也就是[NSNull null]获取的对象 用于做数组的空占位符 是对象但是是一个没意义的对象
NSLog(@"%li",[[NSArray arrayWithObjects:@1,@2, [NSNull null],@3,nil] count]);//这样写数组就有4个 第3个是空的占位符
NSLog(@"%li",[[NSArray arrayWithObjects:@1,@2, nil,@3,nil] count]);//这样写数组只有2个 到第三个就结束了
//判断是否为空占位符时需要用 $obj == (id)kCFNull 来判断
方法需要传枚举参数 但是使用时又不想传枚举值时可以使用kNilOptions(其实是0)
@protected 该类和所有子类中的方法可以直接访问这样的变量。//默认
@private 该类中的方法可以访问,子类不可以访问。
@public 可以被所有的类访问
@package 本包内使用,跨包不可以
$obj->xxx 表示访问某个对象的某个成员变量
取变量内存地址值 &变量 例子:int i;NSLog(@"%li",&i);
常量无(任意)类型指针 const void *xxx;
变量无(任意)类型指针 void *xxx;
定义静态方法
static NSInteger xxx(NSInteger i){
return i ;
}
CFMutableDictionaryRef CFDictionaryRef (可以用任意类型作为key)
//创建一个CFMutableDictionaryRef引用
CFMutableDictionaryRef ref = CFDictionaryCreateMutable(CFAllocatorGetDefault(), 2,
//系统默认提供了键值的回调常量
&kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
NSArray *key = @[@"name"];
NSString *value = @"vijay";
CFDictionarySetValue(ref, (void *)key, (void *)value);
NSLog(@"%@",ref);
//CFDictionaryRef
CFStringRef keys[1];
keys[0] = CFSTR("name");
CFStringRef values[1];
values[0] = CFSTR("vijay");
CFDictionaryRef ref = CFDictionaryCreate(CFAllocatorGetDefault(), (void *)keys, (void *)values, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
NSLog(@"%@",ref);
获取某个类的成员属性(成员变量) 和方法
Dog * dog = [[Dog alloc] init];
unsigned int outCount = 0;
unsigned int outCountMethod = 0;
Ivar * ivars = class_copyIvarList([dog class], &outCount);
Method * methods = class_copyMethodList([dog class], &outCountMethod);
for (int i = 0; i<outCount; i++) {
// 取出i位置对应的成员变量
Ivar ivar = ivars[i];
// 查看成员变量
const charchar *name = ivar_getName(ivar);
NSLog(@"%s", name);
}
for (int j = 0; j < outCountMethod; j++) {
Method method = methods[j];
SEL methodSEL = method_getName(method);
const charchar * selName = sel_getName(methodSEL);
if (methodSEL) {
NSLog(@"sel------%s", selName);
}
}
手动立即释放一个对象
//自动计数引用需要等到runloop完成后才调用对象的delloc释放
//free()可以直接释放该内存
free();