1、属性:帮你自动生成setter 和 getter 方法
     属性的声明:(写在.h中)
     格式: @property 数据类型 属性名
     属性的实现:(写在.m中)
     格式: @synthesize 属性名:
例子1:
Person.h
@interface Person : NSObject
//属性的声明:属性:属性名就是实例变量名去掉下划线
@property NSString *gender;
@end
Person.m
//属性的实现
@synthesize gender;
@end
main.m
//属性方法实现gender的setter和getter方法
    person.gender = @"妖";
    NSLog(@"%@",person.gender);//点语法
   NSLog(@"%@",[person gender]);//setter、getter方法
例子2:
teach.h
@interface Teacher : NSObject
//输入属性的类型相同的话,此时就可以把它们写在一个属性声明中,但是每一个属性名前要加*,(是基本数据类型的就不用加*)
@property NSString *name,*color;
@property NSInteger age;
@property CGFloat score;
@end
teach.m
//属性的实现部分可以写在一起,用逗号隔开
//@synthesize name,color,age,score;
//自Xcode5.0之后属性实现部分不应写了,极大提高了变成速率
//如果不写了,系统默认帮你生成以下语句,自动创建一个_name实例变量,并且自动生成setter 和getter方法
//如果实例变量不写
//@synthesize name = _name;
- (NSString *)description
{    +++++++++description 中不能打印self+++++++++++
   // return [NSString stringWithFormat:@"%@-%ld-%.2lf-%@-%@", _name,_age,_score,_color,self];        (1)ERROR!!!
    return [NSString stringWithFormat:@"%@-%ld-%.2lf-%@", _name,_age,_score,self.color];//这样是可以的
属性的优化:
 1.属性的声明和实现可以合并
 2.实现可以省略实例变量的声明(系统自动帮你生成属性名 加下划线的实例变量 如:_name)
 3.属性的实现可以省略
main.m
  //定义一个Teacher类,实例变量name age score color
    //定义一个Teacher对象
    Teacher *tea = [[Teacher alloc]init];
    tea.name = @"小仓";
    tea.age = 18;
    tea.score = 85.3;
    tea.color = @"纯白种人";
    NSLog(@"%@-%ld-%.2lf-%@",tea.name,tea.age,tea.score,tea.color);
   NSLog(@"%@",tea);
======================================================
2、属性的属性:属性的修饰符   主要用来控制setter 和 getter 的方法的实现细节
    1.访问控制组 atomic:原子性,修饰的属性同一时刻只能使用setter 或getter,(setter和getter 是互斥的),安全但效率低;
         atomic 使用场景:在多线程下为保护数据安全可以使用atomic
                 nonatomic :非原子性,允许同时使用setter 或getter方法,不安全但效率高,推荐使用nonatomic
     2.内存管理组
    assign 默认值  基本数据类型使用assign修饰,代理属性使用assign修饰
     retain 对象类型一般使用retain
    copy  字符串一般用copy修饰,如果要使用copy修饰属性,这个属性必须遵循NSCoping协议
     3.读写控制组
     readWrite : 可读可写,自动帮你生成setter 和getter 方法  默认值
     readOnly  :只读,系统只帮你生成getter方法
     4.重命名组
     setter = setter新名字
     getter = getter 新名字
(除了BOOL特殊情况,其他的一般不使用这种方法)
例子1:定义一个Boy的类;实例变量 name age gender
    自定义初始化方法
    遍历构造器方法

    重写description 方法
Boy.h
@interface Boy : NSObject
//属性修饰符写在@propety后面的()小括号中
//属性修饰符可以写多个,每一个修饰符之间用逗号隔开
//系统默认readwrite  ,平时可以不写
@property (nonatomic,copy,readwrite,setter=setAAA:,getter=AAA)NSString *name;
@property (atomic,copy,readwrite)NSString *gender;
@property (nonatomic,assign,readonly)NSInteger  age;
//苹果的习惯,如果一个属性是Bool类型的,会对getter方法重命名
@property (nonatomic,assign,readwrite,getter=isFalg)BOOL flag;
@end
Boy.m  使用属性可以不写实现部分
main.m
//建一个Boy对象
    Boy *boy = [Boy boyWithName:@"zhangsan" gender:@"yao" age:18];
   NSLog(@"%@",boy);
// readOnly  只读不能写
//    boy.age = 18;  error!!
   NSLog(@"%ld",boy.age);
    //name属性的setter和getter方法起了别名
    [boy setAAA:@"Lisi"];
    NSLog(@"%@",[boy AAA]);
    boy.name = @"Wanger";
    NSLog(@"%@",boy.AAA);
    boy.name = @"Mazi";
   NSLog(@"%@",boy.name);
例子2: 定义一个Girl类,实例变量 name,sex,age,height,写属性的属性,自定义初始化方法,便利构造器方法,重写description方法
Girl.h
@interface Girl : NSObject
@property (nonatomic,copy)NSString *name;
@property(nonatomic,copy) NSString *sex;
@property (nonatomic,assign)NSInteger age;
@property (nonatomic,assign)CGFloat height;
//- (void)sayHi; error!!!
- (id)initWithGirlFriend : (NSString *)name sex : (NSString *)sex age : (NSInteger)age height : (CGFloat)height;
+ (id)girlWithGirlFriend : (NSString *)name sex : (NSString *)sex age : (NSInteger)age height : (CGFloat)height;
@end
Girl.m
@implementation Girl
//当属性生成的setter和getter方法的实现,不满足你的需求时,可以重写setter和getter方法
//当完全重写setter和getter方法时,@synthesize name= _name;,就是实效的
       解决问题的方法
     1.只重写setter和getter 方法中的一个
     2.自己添加@synthesize name= _name;
@synthesize name= _name;
- (void)setName:(NSString *)name
{
    NSLog(@"你好小姐");
//    _name = name;
//   self.name = name;  //self.name == [self setNane : name];
   
//            NSLog(@"%@",self.name);       //self.name == [self name];
            _name = name;
}
- (NSString *)name{
//    return self.name;  error!!!   [self name];      (2)ERROR!!!  
    return _name;
}
++++++方法内部是不能用方法调用自己++++++
//- (void)sayHi{
//    NSLog(@"小仓");
//    [self sayHi];
//}                                                                         ( 3) ERROR!!!
//初始化和遍历构造器方法
- (id)initWithGirlFriend : (NSString *)name sex : (NSString *)sex age : (NSInteger)age height : (CGFloat)height{
    if (self = [super init]) {
        _name = name;
        _sex = sex;
        _age= age;
        _height = height;
    }
    return self;
}
+ (id)girlWithGirlFriend : (NSString *)name sex : (NSString *)sex age : (NSInteger)age height : (CGFloat)height{
    return [[Girl alloc]initWithGirlFriend:name sex:sex age:age height:height];
}
//description方法
- (NSString *)description
{
    return [NSString stringWithFormat:@"%@-%@-%ld-%.2lf", _name,_sex,_age,_height];
}
--------------------------------------------------------------------
//第3知识点KVC  Key-Value-Coding 键值编码  例题中的调用部分
- (void)setValue:(id)value forUndefinedKey:(NSString *)key{
    NSLog(@"没有在Girl类中找到此key值");
}
- (id)valueForUndefinedKey:(NSString *)key{
    return nil;
}
@end
main.m
Girl *g = [Girl girlWithGirlFriend:@"如花" sex:@"yao" age:28 height:175.6];
   NSLog(@"%@",g);
    g.name = @"翠花";
   NSLog(@"%@",g.name);
====================================================
3、 KVC  Key-Value-Coding 键值编码
通过KVC访问实例变量,是一种间接访问实例变量的形式
例子:
Man.h
@class Girl;
@interface Man : NSObject
{
    NSString *_name;
}
@property(nonatomic,retain)Girl *girlFriend;
//@property (nonatomic,copy)NSString *name; //做例子实例变量
@property (nonatomic,assign)NSInteger age;

- (id)initWithName : (Girl *)girlFriend name : (NSString *)name  age : (NSInteger)age;

+ (id)manWithName : (Girl *)girlFriend  name : (NSString *)name  age : (NSInteger)age;

@end
Man.m
#import "Man.h"
#import "Girl.h"
@implementation Man
//实现初始化方法
- (id)initWithName : (Girl *)girlFriend  name : (NSString *)name  age : (NSInteger)age{
    if (self = [super init]) {
        _girlFriend = girlFriend;
        _age = age;
        _name = name;
    }
    return self;
}
//实现遍历构造器方法
+ (id)manWithName : (Girl *)girlFriend name : (NSString *)name  age : (NSInteger)age{
    return [[Man alloc]initWithName:girlFriend name:name age:age];
}
- (NSString *)description
{
    return [NSString stringWithFormat:@"%@-%@-%ld", _girlFriend,_name,_age];
}
------------------------------------------------
//防止没有找到对应的key值而引起的Crash
- (void)setValue:(id)value forUndefinedKey:(NSString *)key  //容易打错
{
    NSLog(@"哈哈,没有找到对应key值");
}
//防止没有找到对应的key值而引起的Crash
- (id)valueForUndefinedKey:(NSString *)key{
    return nil;
}
@end
main.m
//通过key值去类中查找实例变量,先判断有没有实例变量name,若没有就赋值,如果没有接着判断有没有_name,如果有酒赋值
    Man *man = [[Man alloc]init];
    [man setValue:@"妖" forKey:@"name"];
    NSLog(@"%@",[man valueForKey:@"name"]);
    [man setValue:g forKey:@"girlFriend"];
   NSLog(@"%@",[man valueForKey:@"girlFriend"]);
  //想通过man这个对象给girl 这对象的名字赋值@"棉花"
  [[man valueForKey:@"girlFriend"] setValue:@"棉花" forKey:@"name"];
    //通过KVC把棉花打印出来
    NSLog(@"%@",[[man valueForKey:@"girlFriend"]valueForKey:@"name"]);
   
    //KVC通过路径赋值取值(即使没有是实现setter 和 getter 方法也可以通过KVC赋值和取值)
    [man setValue:@"棉花糖" forKeyPath:@"girlFriend.name"];
     NSLog(@"%@",[[man valueForKey:@"girlFriend"]valueForKey:@"name"]);
   NSLog(@"%@",[man valueForKeyPath:@"girlFriend.name"]);
总结:注意前三个例题中的ERROR!!!错误造成Crash!原因是造成递归显现!
                 欢迎分享本文,未经许可,不得转载,转载请注明出处!

Property属性,amp;nbsp;KVC键值编码OC…相关推荐

  1. python取出字典的某个键_python 取出字典的键或者值/如何删除一个字典的键值对/如何遍历字典...

    先定义一个字典并直接进行初始化赋值 my_dict = dict(name="lowman", age=45, money=998, hourse=None) 1.取出该字典所有的 ...

  2. C#中使用键值对存取值并使用Linq通过key获取value

    场景 有时候需要往数据库中存取数据比如 1,2,3 但是取出来后可能需要对应的中文. 首先新建全局变量类Global,然后声明全局字段来存取键值对. Dictionary<string, str ...

  3. 表单form数据默认以键值对的形式将数据回发到服务器,回发非纯文本需使用enctype=multipart/form-data方式编码为整条消息...

    表单使用encrype=application/x-www-form-urlencoded时,各控件数据会以键值对的形式发到服务器,如果表单数据不是文本,这种编码就不能满足需要. 使用enctype= ...

  4. 如何解析属性文件(properties)获取键值对的值?

    文章目录 创建属性文件 解析属性文件获取数据 使用类加载器 使用 File 对象 创建属性文件 新建 db-oracle.properties , 存放项目必须使用到的参数: driver = ora ...

  5. php 获取js对象的属性值,js获取对象,数组所有属性键值(key)和对应值(value)的方法示例...

    本文实例讲述了js获取对象,数组所有属性键值(key)和对应值(value)的方法.分享给大家供大家参考,具体如下: var values=function(object) { var values ...

  6. jquery 获取键值对中最大值_jquery属性的操作

    HTML示例代码: 第一个标题 家用电器分类 家用电器价格 11 男: 女: 第一行 第二行 第三行 第四行 第二个标题 第一段 第二段 属性: attr(n|k,v|p|f):设置或返回被选属性的值 ...

  7. es6 对象中是否有键值_js/es6判断对象是否为空,并判断对象是否包含某个属性...

    js判断对象为空以及有好几种方法了,但是个人觉得不是特别方便. 比如: 1.把对象通过 JSON.stringify 转为字符串,再判断字符串是否等于 " {} " 2.for i ...

  8. 删除对象键值_JavaScript的解构技巧:排除对象属性、避免命名冲突、交换……...

    全文共1583字,预计学习时长7分钟 图源:unsplash 解构是JavaScript中的一个强大工具.它可以从数组和对象中提取出有意义的变量,并用解构来处理JSON数据.嵌套对象或数组非常方便. ...

  9. 键值 keyCode事件属性

    keyCode属性返回onkeypress事件触发的键值的字符代码,或onkeydown/onkeyup的键的代码. 两种代码类型的区别是: 字符代码 - 表示 ASCII 字符的数字 键盘代码 - ...

最新文章

  1. leetcode 225 用队列实现栈(JS)
  2. 根据工作年限预测工资python代码实现
  3. VSCODE修改文字编码格式为GB2312和TAB键为2个空格(MDK5和VSCODE联合开发STM32程序)
  4. 计算机应用基础(高起专)答案,东北师范大学14秋《计算机应用基础(高起专)》14秋在线作业1答案...
  5. 大型网站HTTPS实践:HTTPS对性能的影响
  6. Java基础入门笔记-算术运算符
  7. 内推 | 旷视研究院深度学习实习生招聘(含内推邮箱)
  8. 牛客多校第六场G Is Today Friday?(吉姆拉尔森/蔡勒公式 + 思维)题解
  9. SQL Server 本机 Web 服务的使用方案(转载)
  10. Unity 资源断舍离(资源清理重复以及引用被引用查找)
  11. 2021-03-19Windows取消禁止驱动签名的方法
  12. Java 中代码优化的 30 个小技巧(下)
  13. 人类简史 - ZhiMap思维导图 (转载)
  14. -----前端换肤----
  15. 关于idea的debug调试
  16. 1166 - Unknown error 1166[mysql 错误
  17. 1016: 银行利率 Python
  18. 华为网吧服务器型号,网吧服务器推荐
  19. Vue进阶(幺零二):面试必备:2023 Vue经典面试题整理(含答案)
  20. Java项目:SSM药品进货销售管理系统

热门文章

  1. [CF917D]Stranger Trees[矩阵树定理+解线性方程组]
  2. Codeforces 468C/469E 易错点
  3. 移动測试技术保护源码!解码全球首款移动端白盒測试工具ThreadingTest (文章转自己主动点科技)...
  4. 详解在Visual Studio中使用git版本系统
  5. 《C#高级编程》 读书心得1--核心C# 几点你可能没注意,但很基础的小东西。
  6. CEMAPI实战攻略(四)——发送短消息
  7. 对产品经理而言,有一种灾难叫“老板说”
  8. 猎豹产品经理:「全球化产品」应该要避开的几个坑
  9. 福利|PMCAFF问答专家群-社区大咖聚集地
  10. centos7安装配置cacti