当前位置: 首页 > news >正文

关于OC中变量相关知识点

众所周知,变量是用来存储数据的
围绕着变量,有很多知识点,总结归纳一下

  • 变量的类型
  • 变量的作用区域
  • 局部变量
  • 全局变量
  • 静态变量
  • 变量的访问范围
  • 属性
  • 成员变量
  • 实例变量
  • synthesize
  • dynamic

变量的类型

变量大致分为两大类型:

  • 基本数据类型
  • 非基本数据类型(指针/对象/Class类型)

基本数据类型包括:

int/float/double/bool/enum/struct

NSInteger:typedef long NSInteger;
CGFloat: typedef CGFLOAT_TYPE CGFloat;
而CGFLOAT_TYPE的定义是:

 #if defined(__LP64__) && __LP64__# define CGFLOAT_TYPE double#else# define CGFLOAT_TYPE float#endif

也就是,CGFloat就是float或double,依然是基本数据类型

bool、BOOL、boolean

bool:其实就是C语言中的bool
BOOL: typedef bool BOOL; 也就是BOOL和bool没有任何区别
apple官方文档关于BOOL的定义

Boolean:typedef unsigned char Boolean;(进入Xcode,可以看到)

非基本数据类型

存储的指针类型的变量类型,也就是存储的是地址的变量类型

变量的作用区域

根据变量写在的位置不同,有不同的作用区域

全局变量:在全局写的变量,整个文件都可以访问该变量
局部变量:在函数内部的变量,只有该函数内部才能访问,出了作用域不可访问

以上,默认都是auto修饰

静态变量:使用static修饰的全局变量或局部变量

静态局部变量:

  • 可以延迟变量的生命周期,本来是在大括号就回收的变量,其生命周期可以延迟至程序结束
  • 只初始化一次

静态全局变量:只有当前类可以访问该变量

//测试static
- (void)testStatic
{int c = 1;static int d = 1;for(int i = 0; i < 3; i++){int a = 1;printf("int a变量为 %d \n",a);a++;static int b = 1;//因为static变量只初始化一次,所以第二次for循环及以后都不执行这一句代码printf("static int b变量为 %d\n",b);b++;printf("int c变量为 %d \n",c);c++;printf("static int d变量为 %d \n",d);d++;}
}

打印结果:
int a变量为 1
static int b变量为 1
int c变量为 1
static int d变量为 1
int a变量为 1
static int b变量为 2
int c变量为 2
static int d变量为 2
int a变量为 1
static int b变量为 3
int c变量为 3
static int d变量为 3

auto register static extern

auto

auto: 表明变量具有自动存储类型
auto说明符只能用在具有代码块作用域的变量的声明中, 但是由于这类变量本身就具有自动存储类型(存储于运行时堆栈中), 所以auto通常只是起显式说明的作用.

register

register: 表明变量具有硬件寄存器存储类型
register也只能用在具有代码块作用域的变量的声明中, 表示程序员希望将该变量放在CPU的寄存器中, 从而可以比普通变量更快的访问和操作该变量. 但是无法获得寄存器存储类型的变量的地址, 并且具体是否会将register声明的变量存放于寄存器中由编译器决定

register声明的变量常称为寄存器变量

static

static: 表明变量具有静态存储类型或则标识符具有内部链接属性

extern

extern: 表明标识符具有外部链接属性或者该变量在别处定义

static修饰函数

static修饰的函数是一个内部函数,只能在本文件中调用,其他文件不能调用

变量的访问范围

变量根据访问访问,可以分为:public、protected、private、package

public

声明为 @public 的实例变量是访问控制中开放范围最广的,其允许外界可以直接访问(当然,前提是引入包含该声明的头文件)。

protected

声明为 @protected 的实例变量只能在本类、本类的分类以及子类中使用。注意,当不使用任何访问控制修饰符时,类中实例变量默认即为 @protected(注意:类扩展中是个例外,详见「类扩展」一节)

private

声明为 @private 的实例变量是访问控制中开放范围最小的,只能被本类和本类的分类访问到,子类中也无法访问。在类声明中的属性(@property),系统会自动为我们创建一个 _ 开头的实例变量,这个实例变量的可见程度默认也是 @private。

package

同一个“体系内(框架)"可以访问,介于@private和@public之间

属性、成员变量、实例变量

属性

属性,property,是指的右@property建立的
例如:@property (copy, nonatomic) NSString *postId;
@property负责三个事情:

  1. set,get方法的声明
  2. set,get方法的实现
  3. 生成_postId的实例变量

成员变量

成员变量指的是

@interface
{int age;NSObject *obj1;
}
@end

大括号中间的内容

实例变量

实例变量ivar(instance variables),指的是{}中,是对象的一类,也就是有指针的,非基本数据类型。例如NSObject *obj1;

也就是说,成员变量 = 实例变量 + 基本数据类型变量

需要注意⚠️的是:如果既有成员变量,又有属性,则先写成员变量,再写属性

参考:OC中属性和成员变量(一)概念篇

也有资料说,成员变量 = 实例变量
属性property
实例变量ivar
成员变量的英文单词是?

synthesize

synthesize: 合成

Xcode4时,@property只能在.h中生成getter、setter方法的声明, 需要在.m中手动加上@synthesize,才会有setter\getter的实现,以及对应的变量_property;

Xcode4之前 :
property = setter方法声明 + getter方法声明
synthesize = ivar + setter实现 + getter实现

在之前的OC中,写一个@property,还需要对应写一个@synthesize
@synthesize age = _age;
其作用是,将你写的age属性,和_age成员变量联系起来(@synthesize 合成访问器方法)

既是生成成员变量+方法实现,也是将成员变量和属性关联起来

现在,Xcode不需要写@synthesize age = _age;,在写@property的时候,会自动给加上

从Xcode5开始, 编译器有了自动合成机制(Auto property synthesis),只写@property就可以自动生成_property成员变量和getter、setter方法的声明和实现, 不需要写synthesize了。

Xcode5之后, 其实property和synthesize的职责没变,只是编译器会默认添加synthesize, 真实的情况还是 :
property = setter方法声明 + getter方法声明
默认添加的synthesize = ivar + setter实现 + getter实现
---->看起来变成了 property = ivar + setter(声明+实现) + getter(声明+实现)

自动合成机制(Auto property synthesis) :如果我们既没有写synthesize也没有写dynamic,那编译器默认会为我们添加:@synthesize property = _property;
如果不存在_property,则会创建一个_property成员变量
如果存在,则不会添加成员变量

因此在类内部我们可以使用 _property 来进行赋值、取值操作。

@synthesize到底对属性干了什么, 使用场景总结

但,自动合成机制有时候会失效

什么情况下自动合成会失效 ?

  • 同时重写了属性的setter和getter时;
  • 重写了只读属性的getter时;
  • 使用了@dynamic时;
  • 在 @protocol 中定义的所有属性;
  • 在category 中定义的所有属性;
  • 父类已有的属性, 子类重载的属性不会自动合成;

现在,synthesize的作用是:

  1. 需要给属性起个别名
  2. 手动添加了 setter/getter 方法
  3. 实现了带有peoperty属性的protocol

dynamic

@dynamic告诉编译器: 属性的setter,getter方法由用户自己实现, 不自动生成

使用@dynamic age;就不会自动生成age的setter/getter方法的实现,也不会自动生成成员变量(ivar)。
需要注意的是,age的setter/getter方法的声明是不受影响的。

相关文章:

关于OC中变量相关知识点

众所周知&#xff0c;变量是用来存储数据的 围绕着变量&#xff0c;有很多知识点&#xff0c;总结归纳一下 变量的类型变量的作用区域局部变量全局变量静态变量变量的访问范围属性成员变量实例变量synthesizedynamic… 变量的类型 变量大致分为两大类型&#xff1a; 基本数据…...

机器学习分类模型评价指标总结(准确率、精确率、召回率、Fmax、TPR、FPR、ROC曲线、PR曲线,AUC,AUPR)

为了看懂论文&#xff0c;不得不先学一些预备知识&#xff08;&#xff08;55555 主要概念 解释见图 TP、FP、TN、FN 准确率、精确率&#xff08;查准率&#xff09;、召回率&#xff08;查全率&#xff09; 真阳性率TPR、伪阳性率FPR F1-score2TP/(2*TPFPFN) 最大响应分…...

go语言(十一)----面向对象继承

一、面向对象继承 写一个父类 package mainimport "fmt"type Human struct {name stringsex string }func (this *Human) Eat() {fmt.Println("Human.Eat()...") }func (this *Human) Walk() {fmt.Println("Human.Walk()...") }func main() {h…...

一款自动化提权工具

免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删除。…...

【Qt】最详细教程,如何从零配置Qt Android安卓环境

这里写自定义目录标题 安装Qt Creator & Qt安装下载&安装JDK设置Android SDKAndroid模拟器下载创建android设备&#xff08;模拟器&#xff09; Gradle安装问题解决无法打开安卓模拟器Build失败方案一&#xff1a;不适用Qt自带SDK管理器&#xff08;失败&#xff09;方…...

spring与spring boot的区别

spring与spring boot的区别 项目配置&#xff1a; Spring&#xff1a; 在Spring中&#xff0c;项目的配置通常需要在XML文件中进行&#xff0c;包括配置数据源、事务管理、AOP等。这需要开发人员手动配置很多细节。 <!-- 在Spring中使用XML配置数据源 --> <bean id…...

http网络编程——在ue5中实现文件传输功能

http网络编程在ue5中实现 需求&#xff1a;在unreal中实现下载功能&#xff0c;输入相关url网址&#xff0c;本地文件夹存入相应文件。 一、代码示例 1.Build.cs需要新增Http模块&#xff0c;样例如下。 PublicDependencyModuleNames.AddRange(new string[] { "Core&q…...

JVM之java内存区域[2](堆、方法区、直接内存)

文章目录 版权声明一 堆1.1 java堆1.2 模拟堆区的溢出1.3 arthas中堆内存相关的功能1.4 设置大小 二 方法区2.1 方法区简介2.2 补充&#xff1a;字符串常量池和运行时常量池2.3 方法区的大小设计2.4 arthas中查看方法区2.5 模拟方法区的溢出2.7 StringTable的练习题 三 神奇的i…...

k8s-kubectl常用命令

一、基础命令 1.1 get 查询集群所有资源的详细信息&#xff0c;resource包括集群节点、运行的Pod、Deployment、Service等。 1.1.1 查询Pod kubectl get po -o wid 1.1.2 查询所有NameSpace kubectl get namespace 1.1.3 查询NameSpace下Pod kubectl get po --all-namespaces…...

如何在Docker上运行Redis

环境: 1.windows系统下的Docker deckstop 1.Pull Redis镜像 2.运行Redis镜像 此时,Redis已经启动&#xff0c;我们登录IDEA查看下是否连接上了 显示连接成功&#xff0c;证明已经连接上Docker上的Redis了...

【深度学习:集中偏差】减少计算机视觉数据集中偏差的 5 种方法

【深度学习&#xff1a;集中偏差】减少计算机视觉数据集中偏差的 5 种方法 有偏差的计算机视觉数据集会导致哪些问题&#xff1f;如何减少计算机视觉数据集中偏差的示例观察并监控带注释样本的类别分布确保数据集代表模型适用的人群明确定义对象分类、标记和注释的流程为标签质…...

java数据结构与算法刷题-----LeetCode667. 优美的排列 II

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 解题思路 题目要求我们返回一个数组长度为n的数组&#xff0c;必须含有1~n…...

win10 20h2 defender添加排除项失败怎么回事 Window Defender添加不了排除项如何处理

我们都知道win10系统中是内置有Windows Defender安全防护软件的&#xff0c;会自动对电脑中的所有文件进行扫描&#xff0c;但是有用户可能某些文件不希望被扫描&#xff0c;那么我们可以添加排除项&#xff0c;可是有不少win10 20h2用户在defender添加排除项的时候却失败了&am…...

mysql生成最近24小时整点时间临时表

文章目录 生成最近24小时整点生成最近30天生成最近12个月 生成最近24小时整点 SELECT-- 每向下推1行, i比上次减去1b.*, i.*,DATE_FORMAT( DATE_SUB( NOW(), INTERVAL ( -( i : i - 1 ) ) HOUR ), %Y-%m-%d %H:00 ) AS time FROM-- 目的是生成12行数据( SELECTa FROM( SELECT…...

基于PHP反序列化练习

PHP创建一个以自己姓名命名的类&#xff0c;要求存在两个属性&#xff0c;name&#xff0c;age&#xff0c;进行序列化&#xff0c;输出序列化以后的数据。 <!-- PHP创建一个以自己姓名命名的类&#xff0c;要求存在两个属性&#xff0c;name&#xff0c;age --> <?…...

ITSS、ITIL、ISO20000:哪个更适合你?

在IT服务管理领域&#xff0c;ITSS、ITIL和ISO20000是备受关注的三大标准。它们在性质、设立组织、目的和适用对象等方面各有千秋。那么&#xff0c;如何在这三大标准中选择最适合自己的呢&#xff1f;下面&#xff0c;让我们一起揭开它们的神秘面纱&#xff01; 1️⃣ 性质&am…...

Linux配置yum源以及基本yum指令

文章目录 一、yum介绍二、什么是软件包三、配置yum源四、一键配置yum源【三步走】五、yum指令搜索软件安装软件卸载软件 六、其他yum指令更新内核更新软件更新指定软件显示所有可更新的软件清单卸载指定包并自动移除依赖包删除软件包&#xff0c;以及软件包数据和配置文件 一、…...

【AI视野·今日Robot 机器人论文速览 第七十五期】Thu, 11 Jan 2024

AI视野今日CS.Robotics 机器人学论文速览 Thu, 11 Jan 2024 Totally 16 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers Analytical Model and Experimental Testing of the SoftFoot: an Adaptive Robot Foot for Walking over Obstacles and Irre…...

阿里云ECS(CentOS镜像)安装docker

目录 1.前置条件 2.连接至ECS 3.yum软件包更新 4.安装docker前置所需软件包 5.添加docker 官方的 yum 软件源 6.安装docker 7.检测是否成功 8.配置阿里云镜像加速器 1.前置条件 在看本文前保证未安装过docker,或者安装过但是清理干净 如果多次安装失败过&#xff0c;…...

服务器工作环境要求

在开展网站服务之前&#xff0c;合适的服务器工作环境是必不可少的。服务器工作环境指需要一定的软硬件条件来保障服务器可以正常地运转和提供高效率的服务。在这篇文章中&#xff0c;我们将会详细讲解服务器工作环境所需的要素。 一、硬件要求 服务器硬件方面包括了基本的电…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

土建施工员考试:建筑施工技术重点知识有哪些?

《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目&#xff0c;核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容&#xff0c;附学习方向和应试技巧&#xff1a; 一、施工组织与进度管理 核心目标&#xff1a; 规…...

C# winform教程(二)----checkbox

一、作用 提供一个用户选择或者不选的状态&#xff0c;这是一个可以多选的控件。 二、属性 其实功能大差不差&#xff0c;除了特殊的几个外&#xff0c;与button基本相同&#xff0c;所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...

海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》

近日&#xff0c;嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》&#xff0c;海云安高敏捷信创白盒&#xff08;SCAP&#xff09;成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天&#xff0c;网络安全已成为企业生存与发展的核心基石&#xff0c;为了解…...