Effective Objective-C学习第一周

这篇具有很好参考价值的文章主要介绍了Effective Objective-C学习第一周。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

OC的起源

OC是一种消息型语言,使用的是“消息结构”而非“函数调用”,由smalltalk演化而来。使用消息结构的语言运行时执行的代码由运行环境来决定,而使用函数调用的语言由编译器决定。

什么是引用计数

OC将堆内存管理抽象出来了。不需要使用malloc或者free来分配或释放对象所占的内存。OC运行期环境把这部分工作抽象成一套内存管理架构,名为“引用计数”。

  • OC为C语言添加了面向对象特性,是其超集。OC使用动态绑定的消息结构,也就是说在运行的时候才会检查对象类型。接收一条消息后,究竟应执行哪种代码,由运行期环境而非编译器来决定。

向前声明某类

当编译一个A类的文件时,想要引入B类,但是不需要知道B类的全部细节,只需要知道有一个类叫B类,可以使用:

@class B;

但是如果要在A类的实现文件中使用B,则需要使用import声明,因为要使用它就要知道B类的所有细节。
这样做延后了引入头文件的时机,只有在确有需要时才引入,这样就可以减少类的使用者所需引入的头文件数量,减少编译时间。
向前声明同样可以解决两个类互相引用的问题。在两个类中互相引用对方的头文件,就会造成“循环引用”。当解析一个头文件时,会发现它引用了另一个头文件,而那个头文件又回头引用了第一个头文件。使用#import而非#include虽然不会导致死循环,但是会使得两个类中有一个无法被正常编译。
如果你写的类继承自某个超类,则必须引入定义那个超类的头文件,同理如果要声明你写的类遵从某个协议,那么该协议必须有完整定义,且不能向前声明。因为向前声明只是声明某个协议的存在,而此时编译器却需要知道该协议的具体定义。

  • 除非确实有必要,否则不要引入头文件。一般来说应在某个类的头文件中使用向前声明来提及别的类,并在实现文件中引入那些类的头文件。这样做可以降低类之间的耦合。
    有时无法使用向前声明,比如要声明某个类遵循一项协议。这种情况下尽量把“该类遵循某项协议”的这条声明放在分类中。如果不行的话就把协议单独放在一个头文件中然后引入。

多用字面量语法

使用字面量语法可以缩减代码长度,使其更为易读。
NSString:

NSString *str = @...;

NSNumber:

NSNumber *num = @1;

NSArray:

NSArray *arr = @[@1, @2, @3];
NSString *two = arr[1];

NSDIctionary:

NSDictionary *dict = @{@1: @“one”, @2: @“two”, @3: @“three”};
NSString *two = dict[@2];

NSMutableDictionary和NSMutableArray:

//字面量语法修改可变数组或者字典中的元素时可这样修改
mutableArray[1] = @2;
mutableDictionary[@3] = @4;

在数组中使用字面量语法时,倘若我们放入数组的元素是变量,其中一个变量为nil,那么编译器会报出异常,方便我们及时发现问题。但是如果使用的不是字面量语法,比如NSArray *arr = [NSArray arrayWithObjects: obj1, obj2, obj3, nil]; 在这个数组中如果obj2为nil,那么arr的值就会只有obj1,它不会报出异常,这是因为arrayWithObjects方法处理参数时发现nil就停止了,这也导致我们无法及时发现问题。字典同理。
因此,使用字面量语法也有助于我们快速发现问题。

字面量语法的局限性

字面量语法有个限制就是:除了字符串以外,所创建的对象必须属于Foundation框架才行。意思是自定义的这些类的子类是不能用字面量语法的。
使用字面量语法创建出来的字符串、数组、字典对象都是不可变的。若想要可变版本,需要:

NSMutableArray *mutableArray = [@[@1, @2, @3, @4]mutableCopy];
  • 应该使用字面量语法来创建字符串、数组、数值、字典。与常规方法相比。字面量语法更加简明扼要。
    应该通过取下标操作来访问数组下标或者字典中的键对应的元素。
    用字面量语法创建数组或字典时,若值中有nil,则会抛出异常。

多使用常量,少使用#define

定义常量应用static const,这样方式定义的常量包含类型信息,可以清楚的了解常量的含义。
定义的常量不应该放在头文件里。如果不打算公开某个常量,则应该将其定义在实现文件里。
变量一定要同时用static和const声明,如果试图修改由const修饰符所声明的变量,那么编译器就会报错。
有时候需要对外公开某个常量,比如使用通知传值的时候要用一个对象来派发通知,然后让其他接收通知的对象来注册通知完成传值。在派发通知的时候需要使用一个字符串来表明这个通知的名称,这个名称就可以声明为一个外界可见的常值变量。这样注册者就无需知道实际字符串的值,只需要以常值变量来注册自己想要接收的通知就行。这一类常量应该放在“全局符号表”中,以便可以在定义该常量的编译单元之外使用。
定义在全局符号表中:

extern NSString *const stringConst;
NSString *const stringConst = @“value”;   
//在上面的代码中,stringConst是一个指针常量,指向NSString对象。                                                                                                                                                                                                                                                                                                                                                                                                             
  • 不要用预处理指令定义常量。这样定义出来的常量不含类型信息,编译器只是会在编译前据此执行查找与替换操作。即使有人重新定义了常量值,编译器也不会产生警告信息,这将导致应用程序中的常量值不一致。
    在实现文件中使用static const来定义“只在编译单元内可见的常量”,由于此类常量不在全局符号表中,所以无须为其命名加前缀。
    在头文件中使用extern来声明全局变量,并在相关实现文件中定义其值。这种常量要出现在全局符号表中,所以其命名应该加一区隔,通常用与之相关的类名做前缀。

用枚举类型

在以一系列常量来表示错误状态码或可组合选项时,宜用枚举为其命名。
定义枚举的语法:

enum connectionState state = disconnected;
enum connectionState {
  disconnected,
  connected,
  connecting,
};
typedef enum connectionState connectionState;
connectionState state = disconnected;

可以指明用何种“底层数据类型”来保存枚举值的变量。因此这样做就可以向前声明枚举变量。若不指明底层数据类型就不可以向前声明,因为编译器不清楚底层数据类型的大小,不知道要给它分配多少空间。
指定底层数据类型:

enum connectionState: NSInteger{...};

在向前声明时指定底层数据类型:

enum connectionState: NSInteger;

不使用编译器分配的序号,使用自定义指定的值:

enum connetcionState {
  //将disconnected的值设为1,而不是编译器指定的0,这样接下来几个枚举的值都会是上一个的值+1
  disconnected = 1,
  connected,
  connecting,
};

定义选项时可以通过枚举组合选项,各选项之间通过“按位或操作符”来组合。文章来源地址https://www.toymoban.com/news/detail-795795.html

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

到了这里,关于Effective Objective-C学习第一周的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Effective Objective - C】—— 熟悉Objective-C

    Objective-C通过一套全新语法,在C语言基础上添加了面向对象特性。Objective-C的语法中频繁使用方括号,而且不吝于写出极长的方法名,这通常令许多人觉得此语言较为冗长。其实这样写出来的代码十分易读,只是C++或Java程序员不太能适应。 Objective-C语言学起来很快,但有很

    2024年01月16日
    浏览(45)
  • 【Effective Objective-C 2.0】协议与分类

    第23条:通过委托与数据源协议进行对象间通信 在软件开发中,对象之间的通信是不可避免的。委托模式(Delegate Pattern)是一种常用的实现对象间通信的方式,也被称为代理模式。委托模式的核心思想是定义一套接口,使得一个对象可以将部分职责委托给另一个对象。在iO

    2024年02月21日
    浏览(51)
  • 第一章 熟悉Objective-C

    Objective—C语言是由Smalltalk演化而来,后者是消息型语言的鼻祖,所以该语言使用的“消息结构”而非“函数调用”。 1. 消息和函数调用之间的区别 关键区别在于: 使用消息结构的语言,其运行所应执行的代码由运行环境来决定;而使用函数调用的语言,则由编译器决定。

    2024年01月18日
    浏览(39)
  • objective-c 基础学习

    目录 第一节:OC 介绍 ​​第二节:Fundation 框架 ​第三节:NSLog 相对于print 的增强 ​第四节:NSString ​第五节:oc新增数据类型 第六节: 类和对象 ​类的方法的声明与实现 ​第七节:类和对象的存储 第八节:nil 与 NULL 第九节:分组导航标记#pragma mark ​第十节:方法与函

    2024年02月07日
    浏览(40)
  • Objective-C学习笔记(block,协议)4.10

    1.block :是一个数据类型,存储一段代码,代码可以有参数有返回值。 2.声明block : 返回值类型 (^block变量名称)(参数列表);                         int (^myblock) (int num1,int num2);                         代码段格式:^返回值类型(参数列表){                            

    2024年04月17日
    浏览(47)
  • 【学习iOS高质量开发】——熟悉Objective-C

    Objective-C和Java、C++都是面向对象语言但是语法上有些许不同。OC使用“消息结构”而不是“函数调用”,这二者的区别主要体现在: 使用消息结构的语言,其运行所应执行的代码由运行环境来决定;使用函数调用的语言,则由编译器决定。OC的重要工作都是由运行期组件来完

    2024年01月19日
    浏览(47)
  • Objective-C学习笔记(ARC,分类,延展)4.10

    1.自动释放池@autoreleasepool: 存入到自动释放池的对象,在自动释放池销毁时,会自动调用池内所有对象的release方法。调用autorelease方法将对象放入自动释放池。     Person *p1 = [ [ [ Person alloc ] init ] autorelease]; 2.在类方法里写一个同名的方法,用于创造对象。 (+)instancetype pers

    2024年04月17日
    浏览(39)
  • Objective-C学习笔记(内存管理、property参数)4.9

    1.引用计数器retainCount: 每个对象都有这个属性,默认值为1,记录当前对象有多少人用。    为对象发送一条retain/release消息,对象的引用计数器加/减1,为对象发一条retainCount,得到对象的引用计数器值,当计数器为0时自动调用对象的dealloc方法。    手动发送消息:-(id)perf

    2024年04月13日
    浏览(43)
  • use gnustep objective-c

    专注于概念,而不是迷失在语言技术细节中 编程语言的目的是成为一个更好的程序员; 也就是说,在设计和实现新系统以及维护旧系统方面变得更加有效 header preprocess interface implementation method variable declare and expression comment basic integer set and float set enum type void type derive type incl

    2024年02月14日
    浏览(41)
  • 【KVC补充 Objective-C语言】

    2024年02月15日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包