zoukankan      html  css  js  c++  java
  • 进击的Objective-C-------------属性,KVC

    1.属性
    @property:表明声明了对象的一个属性
    @synthesize:表示创建该属性的访问器
    OC中关键字补充:
    @interface:声明类
    @implementation:实现类
    @protocol:声明协议
    @required:默认需要实现的方法
    @optional:可以选择的,可以不实现
    @end:代表声明或者   实现结束,与@interface@implementation@protocol配合使用
    @protected:受保护的,该类的实例变量只能在该类和其子类内访问,其他类不能访问
    @private:私有的,该类的实例变量只能在该类内进行访问,而其他的类则不可以进行访问
    @public:共有的,谁都可以访问
    2.属性的属性attributes
    1⃣️读写性控制
    readwrite 可读可写系统默认
    @property (readwrite)NSString *name;
    readonly  只可读不可改只能使用getter不能使用setter方法
    @property (readonly)NSString*gender;
    getter 给getter方法改名字
    @property (getter=fun1)NSString *address;
    setter 给setter方法改名字 记得加: 因为setter方法是有参数的
    @property (setter=fun2:)NSString *number;
    同时使用
    @property (getter=fun4,setter=fun3:)NSString *groupName;
    2⃣️原子性控制
    atomic 默认 多线程使用 占线程资源和内存资源
    @property (atomic)NSString *hobby;
    noatomic 单线程下使用 以后常用
    @property (nonatomic)NSString *job;
    属性可以有多个attributes
    @property (nonatomic,copy)NSString *height;
    3⃣️语义设置
    assign 赋值 如果用assign修饰,setter getter内部就是赋值,不需要考虑内存和指针的问题,他修饰标量(非对象类),assign通常用来修饰int float doubl BOOL delegate
    @property (nonatomic,assign)NSInteger age;
    retain 对象类,一般都是retain来修饰,setter getter方法在内存上做了retain的处理
    @property (nonatomic,retain)NSString *name;/****************/
    copy 说明它遵循了NSCcopying协议,一般情况下用retain即可 setter getter方法在内存上做了copy的处理
    @property (nonatomic,copy)NSString *gender;
    3.点语法
     SingleDog *dog1 = [[SingleDog alloc]init];
        [dog1 setName:@"女神"];
        NSLog(@"%@",[dog1 name]);
        // 直接使用点语法赋值和取值(只要有了settergetter方法)
        dog1.name = @"宋慧乔";
        NSLog(@"%@",dog1.name);
        // 直接使用点语法来操作属性
        dog1.gender = @"";
        NSLog(@"%@",dog1.gender);
    4.kvc 
    (key-value-Coding)键值编码
        // 使用kvc给实例变量赋值 //注意:使用setvalue一定要写对key
        // 类似于setter方法
        [dog1 setValue:@"范冰冰" forKey:@"name"];
        // 取值 类似于getter方法
        NSLog(@"%@",[dog1 valueForKey:@"name"]);
        // kvc 也可以给属性赋值 也可以给字典赋值
        [dog1 setValue:@"women" forKey:@"gender"];
        // kvc 还可以给私有变量取值和赋值(key不能写错 ,字符串匹配)
        [dog1 setValue:@"521521" forKey:@"phoneNum"];
        NSLog(@"%@",[dog1 valueForKey:@"phoneNum"]);
        // 一般从网络上请求下来的数据,一般是数组套字典 字典套数组之类的,直接用kvc去取值和赋值,但这时候别忘了加上forundefinekey方法
    (// 为了防止崩溃,专门和setvalueforkey去配套使用
    - (void)setValue:(id)value forUndefinedKey:(NSString *)key{
        NSLog(@"你写错key值了);}//)
        NSMutableDictionary *dict1 = [NSMutableDictionary dictionary];
        NSDictionary *dict2 = [NSDictionary dictionaryWithObjectsAndKeys:@"a",@"name",@"b",@"gender", nil];
        [dict1 setValuesForKeysWithDictionary:dict2];
        NSLog(@"%@",dict2);
        [dog1 setValuesForKeysWithDictionary:dict2];
        NSLog(@"%@",[dog1 valueForKey:@"name"]);
        NSLog(@"%@",[dog1 valueForKey:@"gender"]);
        // setvalue:forKeyPath
        Pig *pig1 = [[Pig alloc]init];
        Food *food1 = [[Food alloc]init];
        [pig1 setValue:food1 forKey:@"food"];
        [pig1 setValue:@"cabbage" forKeyPath:@“food.name"];
        NSLog(@"%@",[pig1 valueForKeyPath:@“food.name"]);
        NSLog(@"%@",[food1 valueForKey:@"name"]);
  • 相关阅读:
    flask 源码专题(七):threading.local和高级
    flask 源码专题(六):session处理机制
    flask 源码专题(五):SqlAlchemy 中操作数据库时session和scoped_session的区别
    flask 源码专题(四):wtforms Form实例化流程以及csrf验证
    flask 源码专题(三):请求上下文和应用上下文入栈与出栈
    python 追踪函数调用
    flask 源码专题(一):app.run()的背后
    flask 源码专题(二):请求上下文与全文上下文
    边框间距 | border-spacing (Miscellaneous Level 2)
    边框样式属性 | border-top-style (Backgrounds & Borders)
  • 原文地址:https://www.cnblogs.com/sharkHZ/p/4984008.html
Copyright © 2011-2022 走看看