Effective Objective -C 第一章 熟悉iOS

Objective-C 使用的是“消息结构”,使用消息结构与函数调用的语言关键区别在于:使用消息结构的语言,其运行时所应执行的代码由运行环境来决定;而使用函数调用的语言,则有编译器决定。


  1. 运行期组件(runtime component)----动态库(dynamic library)Objective-C是C语言的"超集"(superset),OC中的指针是用来指示对象的。OC使用的动态绑定的消息结构,也就是说,在运行时才会检查对象类型。接受到消息之后,究竟应执行何种代码,由运行期环境而非编译器来决定。

      NSString *someString = @"The String";

      声明一个名为someString 的变量,它的 类型是NSString *,也就是说,此变量为指向NSString的指针。所有OC语言的对象都必须这样声明,因为对象所占内存总是分配在"堆空间"(heap space)中,而绝不会分配在"栈"(stack)上。

      NSString *anotherString = someString;

    两个变量指向同一个实例"The String",两个变量都是NSString*类型的,说明当前"栈帧"里分配了两块内存,每块内存的大小都能容下一枚指针。两块内存里的都是一样,就是NSString实例的内存地址。

  分配在堆中的内存必须直接管理,而分配在栈上用于保存变量的内存则会在其栈帧弹出时自动清理。

  OC中定义不含*的变量,它们可能会使用”栈空间“。这些变量保存的不是OC对象。



2. 在类的头文件中尽量少引入其他头文件

  •  除非确有必要,否则不要引入头文件。一般来说,应在某个类的头文件中使用前置声明来提及别的类,并在实现文件中引入那些类的头文件。这样做可以尽量降低类之间的耦合(coupling)。
  • @class + 类名
  • 有时无法使用前置声明,比如要声明某个类遵循一项协议。这种情况下,尽量吧"该类遵循某协议"的这条声明移至"class-continuation 分类"中。如果不行的话,酒吧协议单独放在一个头文件中,然后将其引入。 


3.多用字面量(literal)语法、少用与之等价的方法

  • 应该使用字面量语法来创建字符串、数组、字典。与创建此类对象的常规方法相比,这么做更贱简明扼要。
  • 应该通过去下标操作来访问数组下标或字典中的键所对应的元素。
  • 用字面量语法创建数组或字典是,若值中有nil,则会抛出异常。因此,务必确保值里不含nil。
  • 例如:字面量字符串 NSString *someString = @"This is a 葫芦娃";


4.多用类型常量,少用#define预处理命令

  • 常量命名规则:若常量局限于某"编译单元(也就是实现文件)"之内,则在前面加字母k;若常量在类之外可见,则通常以类名为前缀。
  • 若不打算公开某个常量,则应将其定义在使用该常量的实现文件里。
  • static const NSTimeInterval kAnimationDuration = 0.3;
  • 变量一定要同时用static与const 来声明。如果试图修改由const 修饰符所声明的变量,那么编译器就会报错。而static 修饰符则意味着该变量仅在定义次变量的编译单元中可见。在OC中,”编译单元“一词通常指每个类的实现文件。假如声明次变量是不加static,则编译器会为它创建一个”外部符号(external symbol)“.此时若是另一个编译单元中也声明了同名变量,那么编译器就抛出一条错误消息:duplicate symbol _kAnimationDyration in:重复定义的两个.m文件中。如果一个变量既声明为static,又声明为const,那么编译器根本不会创建符号,而是会想#define预处理指令一样,把所有遇到的变量都替换为常值。但是用这种方式定义的常量带有类型信息。
  • 有时候需要对外公开某个常量。比如派发通知时,通知的名称。此常量需要放在"全局符号表(global symbol table)"中,以便可以在定义该常量的编译单元之外使用。

    extern NSString *const stringConstant;// In the header file

    NSString *const stringConstant = @"Value";// In the implemention file

    这个常量在头文件中"声明",且在实现文件中"定义"。注意:const 修饰符在常量类型中的位置。常量定义应从右至左解读,即stringConstant就是"一个常量,而这个常量是指针,指向NSString对象"。

  • 不要用预处理指令定义常量。这样定义出来的常量不含类型信息,编译器只是会在编译钱据此执行查找与替换操作。即使有人重新定义了常量值,编译器也不会产生警告信息,这将导致应用程序中的常量值不一致。
  • 在实现文件中使用static const来定义"只在编译单元内可见的常量"。由于此类常量不在全局符号表中,所以无须为其名称加前缀。
  • 在头文件中使用extern来声明全局常量,并在相关实现文件中定义其值。这种常量要出现在全局符号表中,所以其名称应加以区别,通常用与之相关的类名做前缀。


5.用枚举表示状态、选项、状态码

  • 枚举只是一种常量命名方式。某个对象所经历的各种状态就可以定义为一个简单的枚举集。实现枚举所用的数据类型取决于编译器,不过其二进制位(bit)的个数必须能完全表示下枚举编号才行。

    typedef enum EOCConnectionState EOCConentionState;就是用简写的 EOCConentionState 来代替完整的enum EOCConnectionState。

  • 凡是需要以按位或操作来组合的枚举都应使用NS_OPTIONS定义,若是枚举不需要相互组合,则应使用NS_ENUM来定义。
  • 应该用枚举来表示状态机的状态、传递给方法的选项以及状态码等值,给这些值起一个易懂的名字。
  • 如果把传递给某个方法的选项表示为枚举类型,而多个选项又课同事使用,那么就将个选项值定义为2的幂,以便通过按位或操作将其组合起来。
  • 用NS_ENUM与NS_OPTIONS宏来定义枚举类型,并指明其底层数据类型。这样做可以确保枚举使用开发者所选的底层数据类型实现出来的,而不会采用编译器所选的类型。
  • 在处理枚举类型的switch语言中不要实现default分支。这样的话,加入新枚举之后,编译器就会提示开发者:switch语句并未处理所有的枚举。
时间: 2024-08-04 18:28:53

Effective Objective -C 第一章 熟悉iOS的相关文章

[Effective JavaScript 笔记] 第一章:让自己习惯javascript小结

在这里整理一下,每条对应的提示 第1条:了解使用的js版本 确定应用程序支持的js的版本(浏览器也是应用程序噢) 确保使用的js特性是应用程序支持的(要不写了也运行不了) 总是在严格模式下编写和测试代码(面向未来编程) 合并代码时注意不同声明的严格模式(还是用第二种解决方案吧,省心) 第2条:理解JavaScript的浮点数 js的数字都是双精度的浮点数 js的整数仅仅是双精度浮点数的一个子集,不是单独的一个类型 位运算将数字视为32位的有符号整数 当心浮点运算的精度问题 第3条:当心隐式的强制

iOS 读书笔记 第一章

1.确定某个实例或类方法是否可用. 1)使用NSObject的类方法instancesRespondToSelector:来确定是否在该类的一个实例中存在一个特定的选择器. NSArray *array = @[@"1",@"2"]; if ([NSArray instancesRespondToSelector:@selector(sortUsingComparator:)]) { //do something use sortUsingComparator: }

iOS开发中的那些的约定俗成(1)————《编写高质量iOS与OS X代码的52个有效方法》读书笔记(第一章)

iOS开发中的那些的约定俗成(1) ----<编写高质量iOS与OS X代码的52个有效方法>读书笔记(第一章) 前言 "我要成为一个高产的开发人员.""想要混的好,就得多努力." 写这些东西是因为毕竟看了书,但是看书看过去之后,也许印象不是很深刻,有些东西现在也理解不了,那我就把我理解的,现在就可以用到的东西,简单的写出来就好,让自己今后看到就能明白其中的意思. 还有就是锻炼一下表达,编辑能力,慢慢的提升自己,随时随地的都要有一个锻炼的心. 最后当然就

代理模式 + Effective C++ 第一章笔记

代理模式(Proxy):为其他对象提供一种代理以控制这个对象的访问. 应用: (1):远程代理,为一个对象在不同的地址空间提供局部代表.这样可以隐藏一个对象存在于不同地址空间的事实 (2):虚拟代理,根据需要创建开销大的对象.通过虚拟代理存放实例化需要很长时间的真是对象. (3):安全代理,用来控制真是对象访问时的权限. (4):智能指针,当调用真实的对象时,代理处理另外一些事. Effective C++: 1:确定对象被使用前已经被初始化 (1),为内置类型进行手工初始化,因为C++不保证初

Objective-C高级编程:iOS多线程及内存管理(第一章翻译)

写在翻译之前:当初看到这本书的时候,感觉深入浅出讲得比较到位,但是在市面上看到的翻译版本翻译的却没有原著的精髓和味道.所以产生了自己将其翻译一下给初学者一些便利的想法.所以才有了这个系列的第一章的翻译.目前剩余的部分依然在翻译过程中,估计不久之后就可以陆续地发出了. 因为本人的水平或者用词问题,本翻译难免有不周详或不正确之处.如果有人看到还望指出,我一定会尽力地修改那些不正确的部分,让更多的人可以看到更优质的资料. Chapter 1 Life before Automatic Referenc

iOS 6 By Tutorials ---第一章--【第一弹】-【翻译】

iOS 6 By Tutorials(pdf 文档)  By the raywenderlich.com Tutorial Team 备注:本人没有怎么翻译过技术型的文章,慢慢翻之.---这本书总共是27章, Chapter 1:Introduction  --第一章:入门介绍 iOS 6 introduces an abundance of great new APIs and technologies that all iOS developers should learn – from A

精通ios开发第六版,第一章,文章中的例子及习题.

第一章 1 #import "ViewController.h" 2 3 @interface ViewController () 4 5 @end 6 7 @implementation ViewController 8 9 10 - (IBAction)buttonPressed:(UIButton *)sender { 11 //取出按钮的title 12 NSString *title = [sender titleForState:UIControlStateNormal];

数据库期末考试复习题 第一章

作者 : Dolphin 原文地址:http://blog.csdn.net/qingdujun/article/details/27820507 一.单项选择题: 1. 位于用户和操作系统之间的一层数据管理软件是  C    . A.DBS  B.DB  C.DBMS  D.MIS 2. 数据库系统中的数据模型通常由    A     三部分组成. A.数据结构.数据操作和完整性约束 B.数据定义.数据操作和安全性约束 C.数据结构.数据管理和数据保护 D.数据定义.数据管理和运行控制 3. 

OSGi原理与最佳实践:第一章 OSGi框架简介(2)

OSGi原理与最佳实践:第一章 OSGi框架简介(2) 由  ValRay 发布 已被浏览4884次 共有3条评论 已被3个人收藏 2013-08-16 21:23 顶(0) 踩(0) osgi原理与最佳实践 1.1.4 开发传统类型的应用 1.1.4.1 B/S 我们首先来看一下,如何基于 OSGi 来开发 B/S 结构的应用.B/S 结构应用程序的开发,可有两个选择:一个是在 OSGi 的框架中嵌入 Http 服务器,另外一个是在 Servlet 容器中嵌入 OSGi 框架.下面分别介绍这两