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 高级 以及内存管理初级的更多相关文章

  1. 关于setter 和 getter方法的一些总结(初级)

    1.最基础的set 和 get 准备工作 Person.h @interface Person : NSObject { NSString *_hobby; // ObjC建议成员变量带"_ ...

  2. ObjC如何通过runtime修改Ivar的内存管理方式

    ObjC如何通过runtime修改Ivar的内存管理方式 为什么要这么做? 在iOS 9之前,UITableView(或者更确切的说是 UIScrollView)有一个众所周知的问题: propert ...

  3. 【原】iOS学习18之OC内存管理高级

    1.属性的内存管理 1> 属性的语义特性 2> assign下的属性内部实现 @property (nonatomic, assign) NSString *name; @synthesi ...

  4. Objective-C 高级编程:iOS与OS X多线程和内存管理

    <Objective-C 高级编程:iOS与OS X多线程和内存管理> 基本信息 原书名: Pro Multithreading and Memory Management for iOS ...

  5. OC7_复合类内存管理(setter方法)

    // // Person.h // OC7_复合类内存管理(setter方法) // // Created by zhangxueming on 15/6/18. // Copyright (c) 2 ...

  6. C#高级编程9 第14章 内存管理和指针

    C#高级编程9 内存管理和指针 后台内存管理 1) 值数据类型 在处理器的虚拟内存中有一个区域,称为栈,栈存储变量的浅副本数据,通过进入变量的作用域划分区域,通过离开变量的作用域释放. 栈的指针指向栈 ...

  7. iOS学习之Object-C语言内存管理高级

    一.属性的内存管理

  8. Objective-C 内存管理与高级环境编程 阅读分享

    常用的调试私有API uintptr_t objc_rootRetainCount(id obj) _objc_autoreleasePoolPrint();//查看自动释放池中的对象 LLVM cl ...

  9. 《C#高级编程》学习笔记----c#内存管理--栈VS堆

    本文转载自Netprawn,原文英文版地址 尽管在.net framework中我们不太需要关注内存管理和垃圾回收这方面的问题,但是出于提高我们应用程序性能的目的,在我们的脑子里还是需要有这方面的意识 ...

随机推荐

  1. .netcore 图片处理

    .netcore 图片处理 /// <summary> /// 根据文件类型和文件名返回新路径 /// </summary> /// <param name=" ...

  2. 分布式-信息方式- JMS基本概念

                                              JMS基本概念 ■JMs是什么          JMS Java Messag/ Servite,Java消息服务 ...

  3. SQLite索引

    索引(Index)是一种特殊的查找表,数据库搜索引擎用来加快数据检索.简单地说,索引是一个指向表中数据的指针.一个数据库中的索引与一本书后边的索引是非常相似的. 例如,如果您想在一本讨论某个话题的书中 ...

  4. 黑马lavarel教程---6、简单验证

    黑马lavarel教程---6.简单验证 一.总结 一句话总结: 1.验证的最简单实例:$request的validate方法,验证通过可以继续进行,验证失败就重定向 2.中文提示可以用中文语言包 3 ...

  5. 环信及时通讯 Laravel 扩展包

    laravel-easemob 环信及时通讯 laravel 包开发,用于环信用户.群.聊天室等功能 github 地址   安装 加载包 "link1st/laravel-easemob& ...

  6. du和df目录大小不一致

    最近遇到个问题 df查看基本没有空间了 但是查找大文件 也基本没有 ,原来是之前的大文件删除了 没有生效导致的 用如下命令,查找到相关进程ID 然后kill就行了 lsof | grep delete ...

  7. PHP CI 框架简单使用(二)

    我们简单认识一下CI框架的MVC.示例代码如下 //CI控制器文件Home.php <?php defined('BASEPATH') OR exit('No direct script acc ...

  8. StringUtils.isBlank()检验String 类型的变量是否为空

    在校验一个String类型的变量是否为空时,通常存在3中情况 是否为 null 是否为 "" 是否为空字符串(引号中间有空格)  如: "     ". Str ...

  9. 如何消除 com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server

    在application.properties中添加以下两句话: eureka.client.register-with-eureka=falseeureka.client.fetch-registr ...

  10. 使用docker 部署python 项目

    使用python 开发了一个restfu api程序,使用docker镜像部署.主要有如下步骤,简单记录以供以后参考. 1. 创建DockerFile文件 创建一个DockerFile文件,文件名为D ...