属性(property)与成员变量(ivar)
来源:互联网 发布:qq飞车休闲区辅助源码 编辑:程序博客网 时间:2024/05/29 09:57
类内使用成员变量{}, 类外使用属性@property
/*********** --- Person.h */@interface Person : NSObject { NSString *_name;}@property (nonatomic, copy) NSString *sex;@property (nonatomic, assign) int age;- (void)getPropertyAndiVar;@end/*********** --- Person.m */@implementation Person- (void)getPropertyAndiVar { unsigned int count = 0; objc_property_t *propertyList = class_copyPropertyList([self class], &count); for (int i = 0; i < count; i++) { const char *propertyName = property_getName(propertyList[i]); NSString *name = [NSString stringWithUTF8String:propertyName]; NSLog(@"%@", name); } NSLog(@"-------------------分割线------------------"); Ivar *iVarList = class_copyIvarList([self class], &count); for (int i=0; i<count; i++) { const char *iVarName = ivar_getName(iVarList[i]); NSString *name = [NSString stringWithUTF8String:iVarName]; NSLog(@"%@", name); }}/*********** --- Log */2016-07-01 15:53:00.449 Demo[24420:690011] sex2016-07-01 15:53:00.449 Demo[24420:690011] age2016-07-01 15:53:00.449 Demo[24420:690011] -------------------分割线------------------2016-07-01 15:53:00.449 Demo[24420:690011] _name2016-07-01 15:53:00.450 Demo[24420:690011] _age2016-07-01 15:53:00.450 Demo[24420:690011] _sex
基于上面的代码和输出,主要围绕OC类的变量、类的存取器方法、与变量相关的关键字、内存管理,下面是相关知识点的汇总:
一、属性和成员/实例变量
1, 属性和成员变量是什么?
属性:属性是 "@property" 修饰的元素
成员变量:成员变量是 "{}" 里面的元素
2, OC方法调用的实质?
方法调用 "[] " 的实质是给对象发送消息
3, 点语法(dot syntax)?
OC中的点 "." 是方法调用,给对象发送消息,区别于java中"点"来访问属性
4, LLVM编译器之后的改变?
@property、@synthesize会自动生成成员变量和方法
5, 面向对象编程的一个思想?
高内聚,低耦合。 封装成为某个功能的对象,只需要向外界暴露出对应功能的接口和属性列表,与功能无关的属性和方法的实现应该尽可能的私有化。
二、@property
1, @property 的作用
a. 自动生成成员变量xxx
b. 自动声明setter和getter方法,遵循内存管理的语义
2, 存取器方法与点语法
a. setter方法:方法名必须以set开头,后面的单词首字母大写,只有一个参数,返回值是void
b. getter方法:方法名是变量名,没有get开头,没有参数,有返回值
c. 类的存取器方法常用点语法来调用,赋值的时候调用的是setter,获取值的时候调用的是getter
d. 任何符合累的存取器方法的特征的方法都可以用点语法来操作
3, @property属性修饰符
a. 读写性修饰符:readwrite | readonly
b. 赋值相关修饰符:assign | retain | copy | strong | weak
c. 原子性修饰符:atomic | nonatomic
d. getter和setter修饰符:getter | setter
@property属性的4类修复符
4, 分类中的@property
分类/类别中使用@property只会声明方法不会声明属性,可以使用OC运行时来创建
三、@synthesize
1, @synthesize 的作用
a. 自动指定属性和成员变量对应 @synthesize age=_age, sex=_sex;
b. 自动实现@property声明的setter和getter方法,同样遵循内存管理的语义
2, Xcode 4.3,新的Clang编译器/LLVM编译器
a. Clang会默认加入@synthesize xxx=_xxx,建立属性和成员变量的关系
b. 当然也可以手动加上@synthesize xxx=_bbb,这种方式更加灵活,不必除了下划线两边都一样
3, @dynamic和@synthesize的异同
a. 通过@synthesize 指令告诉编译器在编译期间产生getter/setter方法
b. 通过@dynamic指令,告诉编译器,属性的 setter 与 getter 方法由用户自己实现,不自动生成,如果没有自动生成在运行时调用会crash
c. 有些存取是在运行时动态创建的,如在CoreData的NSManagedObject类使用的某些。如果你想这些情况下,声明和使用属性,但要避免缺少方法在编译时的警告,你可以使用@dynamic动态指令,而不是@synthesize合成指令
四、规范
类的私有成员变量的创建方式有多种,类内访问变量的方式也有多种。在不违背内存管理的原则下,减少隐藏bug,走代码整洁之路,整理出下面的资料
参考资料(戳这里):
> Objective-C中类的类的成员变量与属性
> 类别,属性,成员变量,arc学习总结
> 招聘一个靠谱的 iOS上
> iOS-Runtime知识点整理
> iOS开发中的争议(一)
- 属性(property)与成员变量(ivar)
- 属性(property)与成员变量(ivar)有什么区别?
- 成员变量和属性@property
- @property属性和成员变量
- 属性( @property )与成员变量的那些事 :
- IOS开发中用@interface声明局部变量ivar和用@property声明属性的区别
- Property和实例变量(Ivar)的最佳实践
- 关于ios成员变量和属性@property区别
- property 的成员属性
- Objective-C:为何使用ivar成员变量?Why would you use an ivar?[zz]
- Category添加属性与成员变量
- Category支持添加属性与成员变量
- iOS开发 -- 属性与成员变量
- ios 属性与成员变量的区别
- Runtime 运行时:成员变量与属性
- Runtime(二)成员变量与属性
- ios--成员变量与属性的区别
- objective-c 成员变量与属性
- ssh
- 面试题 集锦
- spring
- @property的4类修饰符
- E. Selling Souvenirs
- 属性(property)与成员变量(ivar)
- 异步复位,同步释放
- Xcode警告忽略
- 总结整理下一个快速开发MVVM框架
- UIView剖析之Draw、Size、Layout方法
- Xcode8-beat升级需谨慎
- Xcode Ghost
- Linux的SOCKET编程详解
- 自动布局库--Masonry使用