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. python 数据库错误处理

    DB API中定义了一些数据库操作的错误及异常,下表列出了这些错误和异常: 异常 描述 Warning 当有严重警告时触发,例如插入数据是被截断等等.必须是 StandardError 的子类. Er ...

  2. python3基础: 元组tuple、 列表list、 字典dict、集合set。 迭代器、生成器

    一.元组: tuple Python 的元组与列表类似,不同之处在于元组的元素不能修改. 元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组 tup2 = (111, 22, 33, ...

  3. python3.6+Xadmin2.0系列(一) xadmin下载及安装

    环境配置:win7+python3.6+Django2.1+xadmin2+PyCharm 一.Xadmin下载及安装: 1.下载: 下载地址:https://github.com/sshwsfc/x ...

  4. 10.Python内置函数一览表

    为了提高程序员的开发效率,Python 提供了很多可以直接拿来用的函数(初学者可以先理解为方法),每个函数都可以帮助程序员实现某些具体的功能. 举个例子,在 Python 2.x 中 print 只是 ...

  5. 「POI 2010」Bridges

    题目链接 戳我 \(Solution\) 看到"最大值最小",就知道应该要二分 二分之后,对于每个\(mid\),只要计算小于\(mid\)的边,然后在剩下的图中判断有无欧拉回路 ...

  6. C++入门经典-例4.3-函数的递归调用之汉诺塔问题

    1:代码如下: // 4.3.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using ...

  7. C# 注册DLL(使用cmd)

    //cmd:"regsvr32 " + dllPath(注册dll的语句) //output:string.Empty(注册后的反馈信息 ) private static void ...

  8. mysql的双主模式配置

    第一台:192.168.0.160 第二台:192.168.0.170 主从配置,第一步:192.168.0.160 作为主数据库,192.168.0.170作为从数据库,配置如下: ======== ...

  9. fastjson解析list ,object中含有list, object中含有map

    1.首先定义测试vo package com.haiyisoft.cAssistantWeb.ui; import java.sql.Timestamp; public class vo {priva ...

  10. Android Context完全解析与各种获取Context方法

    Context类型 我们知道,Android应用都是使用Java语言来编写的,那么大家可以思考一下,一个Android程序和一个Java程序,他们最大的区别在哪里?划分界限又是什么呢?其实简单点分析, ...