属性(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
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,走代码整洁之路,整理出下面的资料
参考资料(戳这里):
属性(property)与成员变量(ivar)的更多相关文章
- Mybatis的PageHelper分页插件的PageInfo的属性参数,成员变量的解释,以及页面模板
作者:个人微信公众号:程序猿的月光宝盒 //当前页 private int pageNum; //每页的数量 private int pageSize; //当前页的数量 private int si ...
- 成员变量和属性区别(@property那点事儿)
历史由来: 接触iOS的人都知道,@property声明的属性默认会生成一个_类型的成员变量,同时也会生成setter/getter方法. 但这只是在iOS5之后,苹果推出的一个新机制.看老代码时,经 ...
- Objective-C Runtime 运行时之二:成员变量与属性
类型编码(Type Encoding) 作为对Runtime的补充,编译器将每个方法的返回值和参数类型编码为一个字符串,并将其与方法的selector关联在一起.这种编码方案在其它情况下也是非常有用的 ...
- Objective-C Runtime 运行时之二:成员变量与属性(转载)
在前面一篇文章中,我们介绍了Runtime中与类和对象相关的内容,从这章开始,我们将讨论类实现细节相关的内容,主要包括类中成员变量,属性,方法,协议与分类的实现. 本章的主要内容将聚集在Runtime ...
- Runtime之成员变量&属性&关联对象
上篇介绍了Runtime类和对象的相关知识点,在4.5和4.6小节,也介绍了成员变量和属性的一些方法应用.本篇将讨论实现细节的相关内容. 在讨论之前,我们先来介绍一个很冷僻但又很有用的一个关键字:@e ...
- 对Objective-C相关的类、方法、属性、成员变量介绍
类的定义@interface FirstClass :NSObject@end//@interface表示声明的是一个类,“:”表示继承关系,@end类的结束类的实现@implementation F ...
- Object-c中的属性和成员变量的关系详解
很多人在初学移动开发的时候会对object-c中的合成存取方法感到疑惑,此处尝试为看到本文有缘人答疑解惑,鄙人才疏学浅,难免有疏漏谬误之处,热烈欢迎诸位看官拍砖指点. 1.合成存取方法: OC为增加开 ...
- iOS中成员变量和属性区别
历史由来: 接触iOS的人都知道,@property声明的属性默认会生成一个_类型的成员变量,同时也会生成setter/getter方法. 但这只是在iOS5之后,苹果推出的一个新机制.看老代码时,经 ...
- IOS 杂笔-4(属性与成员变量的区别)
属性可以用点语法,比如self.xxx,在外部调用也同样可以someClass.xxx. 属性实际上是对一组set和get方法的简单封装(oc的get方法没有get前缀),同样会自动生成一个私有的成员 ...
随机推荐
- linux日常管理-top动态查看负载
动态查看负载命令,具体哪个程序,哪个进程造成的系统负载. top 回车查看 3秒更新一次 第一行和uptime和w第一行显示的一样. CPU使用率,us sy 内存相关,Mem 一共多少,使用了多少, ...
- iconv字符转换
iconv是linux下的编码转换的工具,它提供命令行的使用和函数接口支持 函数接口 iconv函数族的头文件是iconv.h,使用前需包含之.#include <iconv.h> ico ...
- leetcode:234. Palindrome Linked List
这个题目非常好.http://blog.csdn.net/u012249528/article/details/47124771给出了三种解法,其中前两个是不满足条件的,不过具有参考价值: 第一种办法 ...
- [亂數] <細說> C/C++ 亂數基本使用與常見問題
陸陸續續寫了 EA 一.二年,以前亂數引導文回頭看時才發現,怎麼有這麼多細節的錯誤.沒系統. 這篇文章主要引導初學者使用亂數,同時附上常被翻出來討論的議題,C/C++適用,唯以 C 語言撰之. 也由 ...
- layui js中求某一天距今天有多少天
<script> lay('#version').html('-v'+ laydate.v); //执行一个laydate实例 laydate.render({ elem: '#test1 ...
- sql server列转行的几种方法
方法一,临时变量: declare @temp nvarchar(max)='' select @temp=coalesce(@temp,'')+Location+',' from( select d ...
- Unity -- AssetBundle(本地资源加载和加载依赖关系)
1.本地资源加载 1).建立Editor文件夹 2).建立StreamingAssets文件夹和其Windows的子文件夹 将下方第一个脚本放入Editor 里面 脚本一 资源打包AssetBund ...
- JVM 零散知识
年轻代大小选择: 响应时间优先的应用: 尽可能设大,直到接近系统的最低响应时间限制.在此种情况下,年轻代收集发生的频率也是最小的.同时,减少到达年老代的对象. 吞吐量优先的应用: 尽可能的设置大,可能 ...
- Python小世界:项目虚拟环境配置的N种方法
前言 和其他大多数现代编程语言一样,Python对包和 模块的下载.存储以及管理有其自己的一套方法.但是当我们同时开发多个项目工程的时候,不同的项目会将第三方的包存放在相同的路径下.这就意味着,如果有 ...
- 默认约束 default
default :初始值设置,插入记录时,如果没有明确为字段赋值,则自动赋予默认值. 例子:create table tb6( id int primary key auto_increment ...