Category / Extention / 属性 / 成员变量 /
转载自:http://blog.csdn.net/itianyi/article/details/8618128
在ios第一版中,我们为输出口同时声明了属性和底层实例变量,那时,属性是oc语言的一个新的机制,并且要求你必须声明与之对应的实例变量,例如:
@interface MyViewController :UIViewController
{
UIButton *myButton;
}
@property (nonatomic, retain) UIButton *myButton;
@end
最近,苹果将默认编译器从GCC转换为LLVM(low level virtual machine),从此不再需要为属性声明实例变量了。
如果LLVM发现一个没有匹配实例变量的属性,它将自动创建一个以下划线开头的实例变量。因此,在这个版本中,我们不再为输出口声明实例变量。
例如:
MyViewController.h文件
@interface MyViewController :UIViewController
@property (nonatomic, retain) UIButton *myButton;
@end
在MyViewController.m文件中
编译器也会自动的生成一个实例变量_myButton
那么在.m文件中可以直接的使用_myButton实例变量,也可以通过属性self.myButton.都是一样的。
注意这里的self.myButton其实是调用的myButton属性的getter/setter方法
这与c++中点的使用是有区别的,c++中的点可以直接访问成员变量(也就是实例变量)
例如在oc中有如下代码
.h文件
@interface MyViewController :UIViewController
{
NSString *name;
}
@end
.m文件中
self.name 这样的表达式是错误的。xcode会提示你使用->,改成self->name就可以了。
因为oc中点表达式是表示调用方法,而上面的代码中没有name这个方法。
oc语法关于点表达式的说明:
"点表达式(.)看起来与C语言中的结构体访问以及java语言汇总的对象访问有点类似,其实这是oc的设计人员有意为之。
如果点表达式出现在等号 = 左边,该属性名称的setter方法将被调用。如果点表达式出现在右边,该属性名称的getter方法将被调用。"
所以在oc中点表达式其实就是调用对象的setter和getter方法的一种快捷方式, 例如:
dealie.blah = greeble 完全等价于 [dealie.blah setBlah:greeble];
以前的用法,声明属性跟与之对应的实例变量:
@interface MyViewController :UIViewController
{
UIButton *myButton;
}
@property (nonatomic, retain) UIButton *myButton;
@end
这种方法基本上使用最多,现在大部分也是在使用,因为很多开源的代码都是这种方式。
但是ios5更新之后,苹果是建议以以下的方式来使用
@interface MyViewController :UIViewController
@property (nonatomic, retain) UIButton *myButton;
@end
因为编译器会自动为你生成以下划线开头的实例变量_myButton。不需要自己手动再去写实例变量。
而且也不需要在.m文件中写@synthesize myButton;也会自动为你生成setter,getter方法。
@synthesize的作用就是让编译器为你自动生成setter与getter方法。
它还有一个作用,可以指定与属性对应的实例变量,
例如@synthesize myButton = xxx;
那么self.myButton其实是操作的实例变量xxx,而不是_myButton了。
在实际的项目中,我们一般这么写.m文件
@synthesize myButton;
这样写了之后,那么编译器会自动生成myButton的实例变量,以及相应的getter和setter方法。
注意:_myButton这个实例变量是不存在的,因为自动生成的实例变量为myButton而不是_myButton。
所以现在@synthesize的作用就相当于指定实例变量,
如果.m文件中写了@synthesize myButton;那么生成的实例变量就是myButton。
如果没写@synthesize myButton;那么生成的实例变量就是_myButton。
所以跟以前的用法还是有点细微的区别。
注意:这里与类别中添加的属性要区分开来,因为类别中只能添加方法,不能添加实例变量。
经常会在ios的代码中看到在类别中添加属性,这种情况下,是不会自动生成实例变量的。
比如在
UINavigationController.h文件中会对UIViewController类进行扩展
@interface UIViewController (UINavigationControllerItem)
@property(nonatomic,readonly,retain) UINavigationItem *navigationItem;
@property(nonatomic) BOOL hidesBottomBarWhenPushed;
@property(nonatomic,readonly,retain) UINavigationController *navigationController;
@end
这里添加的属性,不会自动生成实例变量,这里添加的属性其实是添加的getter与setter方法。
注意一点,匿名类别(匿名扩展)是可以添加实例变量的,非匿名类别是不能添加实例变量的,只能添加方法,或者属性(其实也是方法)。
ARC
关于强引用,弱引用,arc的使用可以查看文件ios5arc完全指南。
ios5引进的arc确实方便了很多,ARC 的规则非常简单:
只要还有一个变量指向对象,对象就会保持在内存中。当指针指向新值,或者指针不再存在时,相关联的对象就会自动释放。
这条规则对于实例变量、synthesize 属性、本地变量都是适用的。
以前没有arc的时候,必须调用
dealloc方法来释放内存,比如:
- (void)dealloc {
[_myTableView release];
[superdealloc];
}
如果使用了ARC,那么将不再需要dealloc方法了,也不需要再担心release问题了。系统将自动的管理内存。
Category / Extention / 属性 / 成员变量 /的更多相关文章
- 为什么 Category 不能增加成员变量-nonfragile
三.既然是 non-fragile ivars,为什么 Category 不能增加成员变量? 看过一些资料,理由并不是很让人信服.我觉得并不是做不到,只是现在没有做,现在不支持.我在 Opti ...
- 福利->KVC+Runtime获取类/对象的属性/成员变量/方法/协议并实现字典转模型
我们知道,KVC+Runtime可以做非常多的事情.有了这个,我们可以实现很多的效果. 这里来个福利,利用KVC+Runtime获取类/对象的所有成员变量.属性.方法及协议: 并利用它来实现字典转模型 ...
- OC中成员属性 成员变量
比如用property声明一个变量属性 然后我们会为它用懒加载的方式重写get方法 然后我们在使用这个变量的时候,都是用self.itemArray,为什么这样用比较好呢,这是因为self.是对属性的 ...
- ATL向控件添加私有属性-成员变量
https://msdn.microsoft.com/zh-cn/library/cc451389(v=vs.71).aspx ------------------------------------ ...
- 对Objective-C相关的类、方法、属性、成员变量介绍
类的定义@interface FirstClass :NSObject@end//@interface表示声明的是一个类,“:”表示继承关系,@end类的结束类的实现@implementation F ...
- java类(Class)的概念;对象的概念,声明类的属性 和方法,局部变量和成员变量,面向对象编程思维,抽象的概念
类(Class)的概念 类是对一组具有相同特征和行为的对象的抽象描述. 理解: [1] 类包含了两个要素:特性和行为 => 同一类事物具有相同的特征和行为. [2] 类是一个群体性概念.例如:网 ...
- iOS Category 添加属性实现原理 - 关联对象
iOS Category 添加属性实现原理 - 关联对象 RunTime为Category动态关联对象 使用RunTime给系统的类添加属性,首先需要了解对象与属性的关系.对象一开始初始化的时候其属性 ...
- 关于iOS Category实现添加属性及成员变量
iOS分类: 很多说法是只能添加方法,而不能添加成员变量或属性. 有些人可能知道,这种说法是不严谨的,并不是绝对不能添加变量. 解释如下: 我们知道在一个类中用@property声明属性,编译器会自动 ...
- 让Category支持添加属性与成员变量【转载】
Category是Objective-C中常用的语法特性,通过它可以很方便的为已有的类来添加函数.但是Category不允许为已有的类添加新的属性或者成员变量. 一种常见的办法是通过runti ...
随机推荐
- libmad编译
patch -Np1 -i ../libmad-0.15.1b-fixes-1.patch && sed "s@AM_CONFIG_HEADER@AC_CONFIG_HEAD ...
- 千万PV级别WEB站点架构设计
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://sofar.blog.51cto.com/353572/1369762 高性能与多 ...
- From windows live writer
天线数据长度: 4*14*9664*4 = 2164736 信道估计长度: 614400 均衡: 12*1200*4 = 57600
- nefu 1191 平行宇宙 (bfs)
Description 小k是时空贸易者,他经常在两个平行宇宙之间往来经商,现在他要从S点到达E点,问最少需要多长时间.(已知小k在同一个宇宙中只能向上下左右四个方向移动,每次移动需要1个单位时间,且 ...
- vultr vps发布多用户管理功能
中国用户购买海外vps,有一个麻烦之处是付款环节,可能你没有visa信用卡,vultr和digitalocean和linode这类vps不支持支付宝,给一些朋友带来不便.由此产生的vps代购行业,其实 ...
- 菲菲更名宝贝(批量更名软件) v8.0 绿色版
软件名称: 菲菲更名宝贝(批量更名软件)软件语言: 简体中文授权方式: 免费软件运行环境: Win7 / Vista / Win2003 / WinXP 软件大小: 1.5MB图片预览: 软件简介:菲 ...
- AutoTile 自动拼接 番外篇(自动融合技术)
http://pan.baidu.com/s/1dDQyfSl 密码:ttud 先睹为快吧. 之后 还差一个 智能替换 技术.
- cmd 下登陆ftp及相关操作
cmd 下登陆ftp及相关操作 2011-08-09 20:34:28| 分类: 小技巧|字号 订阅 一.举例 假设FTP地址为“ 61.129.83.39”(大家试验的时候不要以这个FTP去试,应 ...
- JavaScript高级程序设计:第十一章
一.选择符API SelectorsAPILevel 1的核心是两个方法:querySelector()和querySelectorAll(). 1. querySelector()方法 queryS ...
- redis第一篇--综述
1 redis里边有数据库的概念.可分为1-255这些表.在存储或者查找的时候要指明. redis_sentinel 集群里边封装成了namespace这样的概念.与db是不一样的.