setter 和 getter 高级 以及内存管理初级
setter 和 getter 的演变,紧接setter 和 getter 初级
1.@property 和 @synthesize
这两个关键字的出现,就是为了剔除代码中的setter方法和getter方法
@property:可以自动生成某个成员变量的setter和getter声明
@property int age;
//相当于下面这两句:
- (void)setAge:(int)age;
- (int)age;
@synthesize自动生成age的setter和getter实现,并且会访问_age这个成员变量
@synthesize age = _age;
这样,我们就省去了写setter方法和getter方法的时间,当然写那个也是极其无聊也是毫无意义。
但是,即便是这样,还是很不爽,在xcode的老版本中,为了避免书写setter方法和getter方法,我们还必须要在@interface 和 @end之间写上 @property int _age; 在@implementation 和 @end 之间写上 @synthesize的代码,很幸运,你们生活在一个幸福的时代,自从xcode4.4之后,@property int _age; 这句代码就把@property和@synthesize的活儿都给干了。
它主要做了下面这几件事:
1)生成_age成员变量的get和set方法的声明;
2)生成_age成员变量set和get方法的实现;
3)生成一个_age的成员变量。
当然,@property方法生成的getter方法和setter方法可能满足不了您的需求,您也可以自己手动添加getter方法和setter方法, 如果手动写了setter方法@property就不会生成setter方法,但还是会生成getter方法,getter同理,如果您将setter方法,getter方法都进行手动书写了,@property将不会为您生成相应的getter方法和setter方法。
例子:
Teacher.h
@interface Teacher : NSObject
@property NSString *name;
@property NSString *gender;
@end
Teacher.m
@implementation Teacher
@synthesize name = _name;
@synthesize gender = _gender;
@end
2.@property
例子:
@property (nonatomic,copy) NSString *name;
@property (nonatomic,retain) NSString *gender;
@property (nonatomic) NSInteger age;
/*
属性的参数:
原子性: atomic 对属性加锁,保证多线程下线程安全,默认值
noatomic 对属性不加锁,多线程下不安全,但是速度快,通常使用!
读写属性: readwrite 生成getter和setter方法,默认值
readonly 只生成getter方法,只读
set方法处理: assign 直接赋值,默认值
使用范围:
理论上:所有数据类型
实际上:基本数据类型
assign (基本数据类型)方式:
- (void)setAge:(NSTnteger)age{
_age = age;
}
retain 在set方法中,对内存优化,先release原来的值,再retain新值
使用范围: 所有对象类型的数据都支持.包括: 系统提供的类和自定义的类
retain 方式:
- (void)setDog:(Dog *)dog{
if (_dog != dog){
[_dog release]; 先release原来的值
_dog = [dog retain]; 再retain新值
}
copy 在set方法中,对内存优化,先release原来的值,再copy新值
使用范围: 一般NSString 和 Block
所有遵守NSCopying协议的对象都支持<NSCopying>
*/
特别注意:以上setter的写法是在MRC环境下的写法,在ARC环境下,不存在retain和release(因为ARC环境下是自动管理引用计数),retain是纯粹的引用计数加1:
内存管理机制:引用计数机制
MRC:手动管理引用计数
ARC:自动管理引用计数
setter 和 getter 高级 以及内存管理初级的更多相关文章
- 关于setter 和 getter方法的一些总结(初级)
1.最基础的set 和 get 准备工作 Person.h @interface Person : NSObject { NSString *_hobby; // ObjC建议成员变量带"_ ...
- ObjC如何通过runtime修改Ivar的内存管理方式
ObjC如何通过runtime修改Ivar的内存管理方式 为什么要这么做? 在iOS 9之前,UITableView(或者更确切的说是 UIScrollView)有一个众所周知的问题: propert ...
- 【原】iOS学习18之OC内存管理高级
1.属性的内存管理 1> 属性的语义特性 2> assign下的属性内部实现 @property (nonatomic, assign) NSString *name; @synthesi ...
- Objective-C 高级编程:iOS与OS X多线程和内存管理
<Objective-C 高级编程:iOS与OS X多线程和内存管理> 基本信息 原书名: Pro Multithreading and Memory Management for iOS ...
- OC7_复合类内存管理(setter方法)
// // Person.h // OC7_复合类内存管理(setter方法) // // Created by zhangxueming on 15/6/18. // Copyright (c) 2 ...
- C#高级编程9 第14章 内存管理和指针
C#高级编程9 内存管理和指针 后台内存管理 1) 值数据类型 在处理器的虚拟内存中有一个区域,称为栈,栈存储变量的浅副本数据,通过进入变量的作用域划分区域,通过离开变量的作用域释放. 栈的指针指向栈 ...
- iOS学习之Object-C语言内存管理高级
一.属性的内存管理
- Objective-C 内存管理与高级环境编程 阅读分享
常用的调试私有API uintptr_t objc_rootRetainCount(id obj) _objc_autoreleasePoolPrint();//查看自动释放池中的对象 LLVM cl ...
- 《C#高级编程》学习笔记----c#内存管理--栈VS堆
本文转载自Netprawn,原文英文版地址 尽管在.net framework中我们不太需要关注内存管理和垃圾回收这方面的问题,但是出于提高我们应用程序性能的目的,在我们的脑子里还是需要有这方面的意识 ...
随机推荐
- UOJ #460. 新年的拯救计划 神仙题+构造
对于这个神仙题,我还能说什么~ 第一个答案=$n/2$ 还是比较好猜的. 对于构造这个树,大概就是先从 $1$ 号节点向 $n/2$ 距离以内都连一条边,再在第 $n/2$ 个节点进行这个操作,然后从 ...
- Compress Words
E. Compress Words 直接套 KMP 即可(那为什么打 cf 的时候没有想到...),求出后一个单词(word)的前缀数组,然后从前面已得的字符串的末尾 - word. length ( ...
- 13.Python字符串详解(包含长字符串和原始字符串)
简单地理解,字符串就是“一串字符”,也就是用引号包裹的任何数据,比如“Hello,Charlie”是一个字符串,“12345”也是一个字符串. Python 要求,字符串必须使用引号括起来,可以使用单 ...
- Linux下测试CPU性能
一.安装stress服务 1.下载stress_1.0.1.orig.tar.gz安装包 2.解压tar xvf stress_1.0.1.orig.tar.gz 3.进入解压目录执行./config ...
- js下拉框选择图片
二种方式:下拉框里面选项有图片与没有图片 1.用下拉框写 下拉框的option没法添加图片如果下拉框里面不需要图片可以用这种方式. <!DOCTYPE html> <html> ...
- JavaScript实现页面滚动到div区域div以动画方式出现
用JavaScript实现页面滚动效果,以及用wow.js二种方式实现网页滚动效果 要实现效果是页面滚动到一块区域,该区域以动画方式出现. 这个效果需要二点: 一:我们要先写好一个css动画. 二:用 ...
- Android_(传感器)获取手机中的传感器
传感器是一种检测装置,能够感受被测量的信息,并能将检测和感受到的信息按一定规律变换成电信号或其它所需形式的信息输出 Android操作系统中内置了很多的传感器(物理装置),能够探测.感受外界的信号.物 ...
- scala基础-1
函数式编程 并行编程 多核计算.云计算 引用透明,给值确定,结果也确定 数据类型 三种变量修饰符 val 定义immutable variable var 定义mutable va ...
- Oracle提高SQL查询效率where语句条件的先后次序
(1)选择最有效率的表名顺序(只在基于规则的优化器中有效): Oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处 ...
- spring框架中AOP思想与各种配置详解
Spring中提供两种AOP支持: 1.基于代理的经典AOP 2.Aspectj注解配置AOP 首先我们先了解什么是AOP,AOP(Aspect Oriented Programming ...