属性(property)与成员变量(ivar)

类内使用成员变量{}, 类外使用属性@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] sex
2016-07-01 15:53:00.449 Demo[24420:690011] age
2016-07-01 15:53:00.449 Demo[24420:690011] -------------------分割线------------------
2016-07-01 15:53:00.449 Demo[24420:690011] _name
2016-07-01 15:53:00.450 Demo[24420:690011] _age
2016-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开发中的争议(一)

时间: 2024-10-20 09:18:29

属性(property)与成员变量(ivar)的相关文章

属性( @property )与成员变量的那些事 :

属性( @property )与成员变量的那些事 : 属性对成员变量扩充了存取方法 . 属性默认会生成带下划线的成员变量 . 早期的 Xcode 不支持自动合成成员变量的存取方法 , 所以古老的iOS工程师是愤怒的 . 后来 Xcode 智能了一点 , 可以用 @synthesize 关键字自动合成成员变量的存取方法 , 此时的iOS工程师是郁闷的 . 现在 Xcode 会在我们声明属性时自动合成存取方法 , 连@synthesize都不用写了 , 这样iOS工程师彻底解放了 . 顺便提一下 @

【iOS开发】@property跟成员变量区别

@property在xcode 4.5之前只是单纯的告诉编译器,“我在后面实现了对那个变量的setter和getter方法,你放心吧”,但是如果你不写synthesize配合的话就会出错.synthesize才是代替setter和getter的关键部分. @synthesize在xcode4.5之前是配合@property使用,帮助你隐式了实现了一个setter和getter.如果你没有在interface里声明变量,它会帮你隐式的创建一个已下划线开头的同名变量,比如@synthesize my

Mybatis的PageHelper分页插件的PageInfo的属性参数,成员变量的解释

//当前页 private int pageNum; //每页的数量 private int pageSize; //当前页的数量 private int size; //由于startRow和endRow不常用,这里说个具体的用法 //可以在页面中"显示startRow到endRow 共size条数据" //当前页面第一个元素在数据库中的行号 private int startRow; //当前页面最后一个元素在数据库中的行号 private int endRow; //总记录数 p

Objective-C Runtime 运行时之二:成员变量与属性

类型编码(Type Encoding) 作为对Runtime的补充,编译器将每个方法的返回值和参数类型编码为一个字符串,并将其与方法的selector关联在一起.这种编码方案在其它情况下也是非常有用的,因此我们可以使用@encode编译器指令来获取它.当给定一个类型时,@encode返回这个类型的字符串编码.这些类型可以是诸如int.指针这样的基本类型,也可以是结构体.类等类型.事实上,任何可以作为sizeof()操作参数的类型都可以用于@encode(). 在Objective-C Runti

Runtime之成员变量&amp;属性&amp;关联对象

上篇介绍了Runtime类和对象的相关知识点,在4.5和4.6小节,也介绍了成员变量和属性的一些方法应用.本篇将讨论实现细节的相关内容. 在讨论之前,我们先来介绍一个很冷僻但又很有用的一个关键字:@encode 1.类型编码 为了协助运行时系统,编译器用字符串为每个方法的返回值.参数类型和方法选择器编码,使用的编码方案在其他情况下也很有用.在 Objective-C 运行时的消息发送机制中,传递参数时,由于类型信息的缺失,需要类型编码进行辅助以保证类型信息也能够被传递.在实际的应用开发中,使用案

对Objective-C相关的类、方法、属性、成员变量介绍

类的定义@interface FirstClass :NSObject@end//@interface表示声明的是一个类,“:”表示继承关系,@end类的结束类的实现@implementation FirstClass方法的声明+(void)print;-(id)init;//"+"表示声明的是一个类方法,由雷鸣调用//“-”表示声明的时实例方法,必须由类的对象来调用//不带参数的方法在调用时,会使用隐藏的self参数来访问实例变量的属性.声明带参数的方法:+(void)initWit

Object-c中的属性和成员变量的关系详解

很多人在初学移动开发的时候会对object-c中的合成存取方法感到疑惑,此处尝试为看到本文有缘人答疑解惑,鄙人才疏学浅,难免有疏漏谬误之处,热烈欢迎诸位看官拍砖指点. 1.合成存取方法: OC为增加开发效率,从2.0之后不需要程序员自己来写成员变量的setter和getter方法,取而代之的是自动合成的setter和getter. 系统自动合成setter和getter需要2步: 在类interface部分用@propert指令定义属性. 在实现部分用@synthesize指令声明属性. 属性的

Objective-C——类、方法、属性、成员变量

有过相关编程语言基础,了解C++/java的相信对类的类.对象等概念是了解的.在此我也不做过多地赘述. 关于OC中类的定义及方法使用这块,OC定义了一套自己的规范 类的定义: @interface FirstClass :NSObject @end //@interface表示声明的是一个类,":"表示继承关系,@end类的结束 类的实现 @implementation FirstClass 方法的声明: +(void)print; -(id)init; //"+"

Objective-C中类的成员变量与属性

在Objective-C的类与对象的概念中. 成员变量与属性的区别与联系一直没有搞清楚. 直到学习了慕课网上的这个课程Objective-C面向对象初体验, 才算真正有了点感觉了. 最关键的结论就是: 类内使用成员变量{}, 类外使用属性@property. 成员变量 成员变量及其get方法. 首先, 我们来看下基本的类成员变量及其使用. // People.h @interface People : NSObject { NSString *_peopleName; } @end 在.m中不做