文档章节

OC常量、变量、属性及其特性

hejunbinlan
 hejunbinlan
发布于 2016/05/16 10:28
字数 2355
阅读 80
收藏 0
点赞 2
评论 0

1.Objective-C中声明常量使用关键字const。如:const double PI = 3.1514;

2.Objective-C中变量可以分为成员变量、局部变量和全局变量(用的很少,尽量不要用)。

//————————------------常量—————————————————//

方法一:

#define kDetailKey            @“detail text”

#define DOWNLOAD_TIMEOUT      60.0

#define degresssToRadian(x)  (M_PT*(X)/180.0)

这种方法直接使用#define定义函数、字符串和数字,和普通的C/C++一样,唯一的区别是字符串需要在前面加上“@”符号。

方法二:

typedef enum{

kTagLanguageView = 100,

kTagSeriesView,

kTagSeriesDetailView,

kTagThumbView,

kTagVideoView,

kTagFullPhotoView,

}TagSystemViews;

使用枚举定义常量,在这里kTagSeriesView等于101,在程序中直接使用kTagSeriesView来表示这个常量,这和C/C++一样。

方法三:

在.m或者.mm文件中使用静态常量声明,和C/C++使用方法一样,例如:

static NSString *BlockColorAlphaComponentKey =@"blockColorAlphaComponent”;

//————————------------变量—————————————————//

1.为了强制一个对象隐藏其数据,编译器限制实例变量范围以限制其在程序中的可见性。

但是为了提供灵活性,苹果也让开发者显示设置范围(四选一)。

2.四种编译指令如下:

@private

实例变量只能被声明它的类访问。

@protected

实例变量能被声明它的类和子类,所有没有显示指定范围的实例变量都是@protected。

@public

实例变量可以在任何地方被访问。

@packge

使用modern运行时,一个@package实例变量在实现这个类的可执行文件镜像中实际上是@public的,但是在外面就是@private。

OC中的@package与C语言中的变量和函数的private_extern类似。任何在实现类的镜像之外想使用这个实例变量都会引发link error。

这个类型最常用于框架类的实例变量,使用@private太限制,使用@protected或者@public又太开放。

//——————————————属性—————————————————//

属性:@property:@property只不过是给编译器看的一种指令,它可以编译之后自动为你生成相应的getter和setter方法。

1.公共属性表示你打算如何使用这一类的对象。

2.属性声明是一个指令,它告诉编译器如何为变量生成存取方法。(添加属性声明后,你将了解到有关存取方法的信息)

3.id类型是一个通用类型,OC使用id表示任意类型的对象,它可以作为一个占位符表示这是一个不确定的类型的对象或者引用。因此,所有的对象都可以用id来表示。

4.编译器指令@property可以为一个类声明属性,这是一个偷懒的好方法,用@property声明属性相当于同时声明并实现了对应的实例变量的访问器方法。当然,也可以通过指定属性的特性(Attribute)类控制自动生成的访问器方法的行为。

5.OC里的实例变量默认都是私有的。私有变量只在类自身和子类的实例方法里可见。

6.iOS OC声明变量在@interface括号中和使用@proper的区别:

方式一:直接在@interface中的大括号中声明。

@interface MyTest:NSObject

{

NSString *mystr;

}

方式二:直接用@property声明

@interface MyTest:NSObject

@property(strong,nonatomic)NSString *mystr;

随后在.m文件中@synthesize mystr = _myStr;(也可以在.m文件中不加@synthesize)

区别:

方式一声明的成员变量是只能在自己类内部使用,而不能在类的外部使用(就是通过类名.点的方式显示不出来。)。

方式二可以在类的外部访问,也可以在类的内部通过下划线+变量名或者self.变量名的方式访问。

苹果开发模板推荐的是方式二。

7.OC是C的严格父集,C能做的事情OC中都能做。

属性实际上一个setter方法和一个getter方法,所有对实例变量的访问都是如此,通过setter方法设置值,通过 getter方法获取值

你没有必要去优化没有必要优化的东西,你要优化的是很花时间的东西,而访问实例变量不会花太多时间。

8..h是共有的API

.m是私有的API以及你所有的实现。

所有指针要么是强的,要么是弱的,因为OC需要知道怎样处理内存和堆。强表示保持这个的存储,在堆中,保持这个所指的东西

7.plist:属性配置文件,基于XML格式,也扮演了一部分定义UI的角色,Xcode在编译的时候会读取里面的配置信息。

8.类的声明提供了这个类和程序员之间的接口,类的声明即接口,其实现代码才是真正执行实际任务的地方。类的声明以@interface指令开始,以@end指令结束。

9.蓝色的竖线:它是UI控件和屏幕边框的距离参考线以及对齐参考线,用于设置控件在不同大小的屏幕上的位置。

13.属性使用点语法,其他情况使用方括号标记语法。

***********************************

copy:

1.简单复制只能实现浅拷贝:指针赋值,使每个指针指向相同的一块内存空间,操作不安全。

2.在iOS中可以这样实现:Foundation类已经遵守了<NSCopying>和<NSMutableCopying>协议,即实现了copy和mutableCopy方法,因此Foundation对象可以使用这些方法创建对象的副本或可变副本。

**************************

为属性声明自定义特性

1.访问器方法

a。我们通过@synthesize这个标记来为属性生成访问器方法。

b。默认情况下,如果我们声明的属性名为propertyName,那么编译器自动生成的访问器方法分别为propertyName:和setPropertyName:。

c。可以通过“getter=getterName”和“setter=setterName”这两个属性的自定义特性来设置访问器方法的名称。

d。自定义访问器方法的名称会导致“点句式”语法糖不好使。

2.可写性

如果给属性加上readonly的特性:编译器不会自动生成setter访问器方法,属性也就变成只读的。

3.setter支持的特性

a。setter方法不仅仅是简单的赋值,有这么几个修饰词是用来描述setter方法的:assign,retain,copy和weak,用不同的修饰词表示生成的setter方法会有所不同。

b。默认是assign,这意味着在setter方法中真的就是简单的赋值。

c。retain:表示赋值之后会调用新值的retain方法和旧值的release方法。

d。copy:表示先将值拷贝一份,然后将这个拷贝赋给实例变量,这个修饰词只适用于实现了NSCopying协议的类型。

e。weak:表示这个值将是一个弱引用,引用和被引用之间没有所属关系。如果系统销毁了某个属性所引用的对象,属性的值会自动地变为nil。一般情况下,如果父对象拥有子对象的引用,那么子对象就不应该再持有父对象的强引用,而是使用弱引用的方式来引用父对象。

f。strong:表示这个值是一个强引用,引用和被引用之间具有所属关系。从内存使用的角度来看,就是引用对象被回收之前,被引用的对象不会被回收。

4.原子化和非原子化:atomi和nonatomic用来决定编译器生成的getter和setter是否为原子操作。

a。nonatomic指定访问器方式是非线程安全的,即多个线程可以同时访问这个属性。

b。默认情况下,访问器方法都是 线程安全的,即使在多线程环境中也毫无风险的。然而,即使要保证在多线程环境中能正常工作,访问器也不一定必须是线程安全的。而将访问器方法指定为非线程安全的,可以让getter方法直接返回实例变量的值,效率更高。

********************

合成(Synthesizing)属性

1.声明一个属性之后编译器会自动将相关的代码补充完整,即编译器会自动声明一个实例变量以及相关的访问器方法,实例变量的名称是属性名称前面加上下划线。

2.不过有时候我们需要自己来指定实例变量的名称,这时候就需要用到@synthesize指令了。

3.

a。如果你不得不手动指定属性对应的实例变量的名称,请在@implementation指令之后使用@synthesize指令做如下声明:

@synthesize label;

这行代码要求编译器根据接口中声明的属性来自动生成访问器方法。

b。也可以使用如下的方式来指明访问器方法使用的实例变量的名称:

@synthesize label = _label;

这里指明了实例变量名为_label,而且这是一种很好的封装实例变量的方法,让所有对该实例变量的访问都通过访问器方法来执行。同时,这种方法也可以避免编译器自动取名字时和已用的实例变量名称冲突的情况。

本文转载自:http://www.linuxidc.com/Linux/2015-05/117917.htm

共有 人打赏支持
hejunbinlan
粉丝 40
博文 534
码字总数 21018
作品 0
浦东
高级程序员
Swift的一些翻译1:Swift Playgrounds

第二章 Swift Playgrounds 去做,玩的开心,享受游戏 -Michael Jordan 在WDC2014,苹果宣布所有的iOS设备都将开始使用一个新的编程语言叫做Swift.Swift被称作"快速,现代,安全,可交互的"编程语言...

zetan ⋅ 2015/12/03 ⋅ 0

Effective OC : 1-5

1,了解Objective-C语言的起源: OC为C语言的超集,为C加入了面向对象的特性。 要理解C中的指针和内存模型。 2.在类文件里尽量少引入其它头文件: 引入过多头文件。将借口暴露,添加耦合度。这...

技术mix呢 ⋅ 2017/10/11 ⋅ 0

swift语法学习

变量和常量 变量,可以修改的 常量,一经定义不能修改 在swift开发中,通常先定义常量,只有必须修改的时候,再改成 注意点: swift是一个对变量类型要求及其严格的语言 任何数据类型之间,都...

冷漠叻荭颜 ⋅ 2015/05/10 ⋅ 1

Swift4.0基础知识回顾

简单介绍一下Swift Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序,Swift语言让应用开发更简单、更快、更稳定,确保最终应用有着更好的质量更多了解Swift可以去《The...

博行天下 ⋅ 2017/12/06 ⋅ 0

OC基础学习:内存中的区域

OC中,内存一般分为五大区域 栈 存储局部变量和实参 由编译器自动分配释放 存储空间有限 地址是连续的 地址分配从大到小 访问速度快 堆 允许程序员自己申请的空间,需要程序员自己控制,会出...

Andy_Ron ⋅ 2017/10/26 ⋅ 0

Swift 4.0 基础学习总结(二)

在 Swift 4.0 基础学习总结(一)中,我们学习的Swift中的基本数据类型以及控制流,Swift简介的语法以及提供的更加适用亲民的方法让我们已经初步感受到这门语言的魅力。今天来继续学习Swift...

xx_cc ⋅ 2017/12/03 ⋅ 0

Swift的setter与getter

最近在公司闲来无事,就在网上找各种项目来学着做,基本都是OC的,然后自己差不多翻译成Swift。可是写着写着的时候发现自己Swift那个蛋疼啊,越来越感觉自己不懂Swift,所以写下一些本菜鸟碰...

伟大的鱼 ⋅ 2015/11/11 ⋅ 0

【iOS开发干货】Objective-C基础知识点总结(一)

长文,建议跳跃选择性阅读,大约10min可以读完全文。 iOS开发 1.目录 1.个人学习建议 2.知识点整理 3.下集预告 iOS这一行,都过了这么多年,还是水分很足,没有几个愿意安安心心查资料写东西...

曹真 ⋅ 2017/06/21 ⋅ 0

Effective objective-C 读书笔记 (第一部分)

第1章 熟悉Objective-C 第1条 了解Objective-C语言的起源 Objective-C是一种“消息结构”的语言,而非“函数调用”语言。 关键区别在于:使用消息结构的语言,其运行时所执行的代码由运行环境...

shenglanya ⋅ 2017/12/05 ⋅ 0

编写高质量iOS与OS X代码的52个有效方法(上篇)

第一章 熟悉Objective-C 1. 了解Objective-C语言的起源 Objective-C(以下简称OC)是C语言的超集,相比C语言多了面向对象的特性。OC使用动态绑定的消息结构,换句话说,只有在运行时才会检查...

凝望向北 ⋅ 2017/04/06 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

个人博客的运营模式能否学习TMALL天猫质量为上?

心情随笔|个人博客的运营模式能否学习TMALL天猫质量为上? 中国的互联网已经发展了很多年了,记得在十年前,个人博客十分流行,大量的人都在写博客,而且质量还不错,很多高质量的文章都是在...

原创小博客 ⋅ 今天 ⋅ 0

JavaScript零基础入门——(十一)JavaScript的DOM操作

JavaScript零基础入门——(十一)JavaScript的DOM操作 大家好,欢迎回到我们的JavaScript零基础入门。最近有些同学问我说,我讲的的比书上的精简不少。其实呢,我主要讲的是我在开发中经常会...

JandenMa ⋅ 今天 ⋅ 0

volatile和synchronized的区别

volatile和synchronized的区别 在讲这个之前需要先了解下JMM(Java memory Model :java内存模型):并发过程中如何处理可见性、原子性、有序性的问题--建立JMM模型 详情请看:https://baike.b...

MarinJ_Shao ⋅ 今天 ⋅ 0

深入分析Kubernetes Critical Pod(一)

Author: xidianwangtao@gmail.com 摘要:大家在部署Kubernetes集群AddOn组件的时候,经常会看到Annotation scheduler.alpha.kubernetes.io/critical-pod"="",以表示这是一个关键服务,那你知...

WaltonWang ⋅ 今天 ⋅ 0

原子性 - synchronized关键词

原子性概念 原子性提供了程序的互斥操作,同一时刻只能有一个线程能对某块代码进行操作。 原子性的实现方式 在jdk中,原子性的实现方式主要分为: synchronized:关键词,它依赖于JVM,保证了同...

dotleo ⋅ 今天 ⋅ 0

【2018.06.22学习笔记】【linux高级知识 14.4-15.3】

14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp

lgsxp ⋅ 今天 ⋅ 0

JeeSite 4.0 功能权限管理基础(Shiro)

Shiro是Apache的一个开源框架,是一个权限管理的框架,实现用户认证、用户授权等。 只要有用户参与一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户...

ThinkGem ⋅ 昨天 ⋅ 0

python f-string 字符串格式化

主要内容 从Python 3.6开始,f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快! 在本文的最后,您将了解如何以及为什么今...

阿豪boy ⋅ 昨天 ⋅ 0

Python实现自动登录站点

如果我们想要实现自动登录,那么我们就需要能够驱动浏览器(比如谷歌浏览器)来实现操作,ChromeDriver 刚好能够帮助我们这一点(非谷歌浏览器的驱动有所不同)。 一、确认软件版本 首先我们...

blackfoxya ⋅ 昨天 ⋅ 0

线性回归原理和实现基本认识

一:介绍 定义:线性回归在假设特证满足线性关系,根据给定的训练数据训练一个模型,并用此模型进行预测。为了了解这个定义,我们先举个简单的例子;我们假设一个线性方程 Y=2x+1, x变量为商...

wangxuwei ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部