黑魔法

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();
上一篇下一篇

猜你喜欢

热点阅读