iOS 成员变量和属性的区别
一. 成员变量
1.成员变量的作用范围:
@public:在任何地方都能直接访问对象的成员变量
@private:只能在当前类的对象方法中直接访问,如果子类要访问需要调用父类的get/set方法
@protected:可以在当前类及其子类对象方法中直接访问(系统默认下是用它来修饰的)
@package:在同一个包下就可以直接访问,比如说在同一个框架
2.注意:
无论父类是在@interface还是@implementation声明的成员变量子类都能拥有;但是子类能不能直接通过变量名来访问父类中定义的成员变量是需要看父类中定义的成员变量是由什么修饰符来修饰的。
3.默认:
在.m中成员变量的修饰符为@private.
在.h中成员变量的修饰符@protected.
- 下面给大家演示下代码:
我们在MidStudent中来调用下看看这些变量哪些可以访问哪些不可以:
有图可以看出,我们在.m里面声明的变量子类是无法访问的(即使给他@public),也会被认为是@private,所以我们的对外属性都会放到.h去声明,然而由于six变量是@private,所以子类还是无法访问的我们再去外部去调用下MidStudent 对象 看看是什么效果
由于我们没有在Student或他的子类里面,所以只能访问.h中@public修饰的变量,也就是name,由于age是@protrcted在外部是不能被访问的!
二. 属性
关于属性的详细说明我就不在这里做过多的说明了,请查询下面的网址:
Objective-C 编程语言官网文档(五)-属性的声明
- 关于@synthesize object = _object 的解释
我们可能见过很多地方都有这样的代码:
2.@synthesize的作用是实现属性的,如getter,setter方法
3.总结:一定要分清属性和变量的区别,不能混淆。@synthesize 声明的属性=变量。意思是,将属性的setter,getter方法,作用于这个变量。
4.但Xocde4.5以后,编译器会为你自动实现setter及getter方法,如果他找不到_father,会为你自动创建一个_father的变量
- 声明属性的时候会有一些关键词这里简单说下他们的含义:
atomic: 原子性
在objective-c 属性设置里面 默认的就是atomic ,意思就是 setter /getter函数是一个原子操作,如果多线程同时调用setter时,不会出现某一个线程执行完setter所有语句之前,另一个线程就开始执行setter,相当于 函数头尾加了锁 . 这样的话 并发访问性能会比较低 .
nonatomic: 非原子性
非原子操作 一般不需要多线程支持的时候就用它,这样在 并发访问的时候效率会比较高 . 在objective-c里面通常对象类型都应该声明为非原子性的. iOS中程序启动的时候系统只会自动生成一个单一的主线程.程序在执行的时候一般情况下是在同一个线程里面对一个属性进行操作.
getter=getterName
指定 get 方法,并需要实现这个方法 。必须返回与声明类型相同的变量,没有参数.相当于重新命名getter方法
setter=setterName:
指定 set 方法,并需要实现这个方法 。带一个与声明类型相同的参数,没有返回值(返回空值)
当声明为 readonly 的时候,不能指定 set 方法
readwirte
如果没有声明成 readonly ,那就 默认是 readwrite 。可以用来赋值,执行set方法
readonly
不可以被赋值
assgin
通常用于标量(简单变量 int , float , CGRect 等)
一种典型情况是用在对对象没有所有权的时候,通常是 delegate ,避免造成死循环(如果用 retain 的话会死循环)
strong
释放旧对象 将旧对象的值赋予输入对象 ,再提高输入对象的索引计数为 1 ,常使用在继承自 NSObject 的类。(MRC为retain)
weak
weak 不增加对对象的引用计数,也不持有对象,因此不能决定对象的释放。它比 assign 多了一个功能,当对象消失后自动把指针变成 nil
copy
建立一个索引计数为 1 的对象 然后释放旧对象 对 NSString 它指出 ,在赋值时使用传入值的一份拷贝 ,拷贝工作由 copy 方法执行,此属性只对那些实行了 NSCopying 协议的对象类型有效。
转自:https://www.jianshu.com/p/6ca11cbe4187
iOS 成员变量和属性的区别的更多相关文章
- C# 成员变量和属性的区别
之前一直在C#中使用这两者, 却一直不知道成员变量和属性还是不一样的两种概念. 不过说不一样, 也不是完全对. 简单举个例子: public class myclass { public string ...
- Java 成员变量和属性的区别
例一: 一个Student pojo类: public class Student{ private String name; private int age; public String getNa ...
- IOS 成员变量,全局变量,局部变量定义,static与extern的区别
IOS 成员变量,全局变量,局部变量定义,static与extern的区别 1,先说定义 1)成员变量定义:生存与该类的生命周期,变量存活周期跟你定义的该类实体对象一样:作用域是整个实体对象:可以在h ...
- OC基础成员变量、属性变量、实例方法与类方法
首先,为什么我们要定义一个新类呢?按照我的理解,就是为了抽象出来一个新的东西(也就是类),用来存储更多的数据变量和方法,一切类都直接或间接继承与NSObject. 在类的头文件里我们可以定义成员变量. ...
- runtime第二部分成员变量和属性
接上一篇 http://www.cnblogs.com/ddavidXu/p/5912306.html 转载来源http://www.jianshu.com/p/6b905584f536 http:/ ...
- Objective-C Runtime 运行时之二:成员变量与属性
类型编码(Type Encoding) 作为对Runtime的补充,编译器将每个方法的返回值和参数类型编码为一个字符串,并将其与方法的selector关联在一起.这种编码方案在其它情况下也是非常有用的 ...
- Objective-C Runtime 运行时之二:成员变量与属性(转载)
在前面一篇文章中,我们介绍了Runtime中与类和对象相关的内容,从这章开始,我们将讨论类实现细节相关的内容,主要包括类中成员变量,属性,方法,协议与分类的实现. 本章的主要内容将聚集在Runtime ...
- 《java入门第一季》之面向对象面试题(成员变量与局部变量的区别)
/* 成员变量和局部变量的区别? A:在类中的位置不同 成员变量:在类中方法外 局部变量:在方法定义中或者方法声明上 B:在内存中的位置不同 成员变量:在堆内存 局部变量:在栈内存 C:生命周期不同 ...
- 刨根问底Objective-C Runtime(4)- 成员变量与属性
http://chun.tips/blog/2014/11/08/bao-gen-wen-di-objective[nil]c-runtime(4)[nil]-cheng-yuan-bian-lian ...
随机推荐
- jQuery (样式篇)
1.$(document).ready 的作用是等页面的文档(document)中的节点都加载完毕后,再执行后续的代码,因为我们在执行代码的时候,可能会依赖页面的某一个元素,我们要确保这个元素真正的的 ...
- Visual Studio C++ MFC界面常用参数更改(改变图标,添加控件,调试打印函数等等)
背景 需要使用Visual Studio C++做一些界面.此篇文章既是记录Visual Studio C++在调整界面时常常遇见的问题. 正文 一.如何更改窗体图标,以及生成的.exe图标 更改窗体 ...
- UE4 场景展示Demo
使用到的level blueprint如下:
- Python 实现的猫脸识别、人脸识别器。
代码地址如下:http://www.demodashi.com/demo/13071.html 前言: OpenCV是开源的跨平台计算机视觉库,提供了Python等语言的接口,实现了图像处理和计算机视 ...
- 《深入浅出mfc》 第1章 笔记
需要什么函数库(.lib) windows支持动态链接库,应用程序所调用 的windows api 函数是在“执行期间“才链接上的.Windows程序调用 可以分为 C Runtimes以及windo ...
- iBatis 使用总结
http://blog.csdn.net/caihaijiang/article/details/6438633 --日期格式化 date_format(createtime,'%Y-%m-%d') ...
- WSDL接口数据传递以及外网发布需要注意的地方
A系统传递数据给B系统 1.A创建asmx推送接口如下 using System; using System.Collection.Generic; using System.Data; using ...
- filebeat 选项
Filebeat Options input_type: log|stdin 指定输入类型 paths 支持基本的正则,所有golang glob都支持,支持/var/log/*/*.log enco ...
- VS2017调试MVC程序,中文输入法下浏览器闪退,程序调试终止
工具->选项-> 项目和解决方案->Web项目->浏览器窗口关闭时停止调试器(s) 复选√ 去掉即可,
- UVA 11014 - Make a Crystal(容斥原理)
UVA 11014 - Make a Crystal 题目链接 题意:给定一个NxNxN的正方体,求出最多能选几个整数点.使得随意两点PQ不会使PQO共线. 思路:利用容斥原理,设f(k)为点(x, ...