Effective Objecttive-C 2.0

中文: 编写高质量iOS与OS X代码的52个有效方法

整体评价: 书中提出了52条建议,如果都能遵守的话,对码代码还是很有帮助的。书中记录的有些东西,现在看有点老,不过很具有参考性。如果感觉飞时间的话,直接翻看每一章最后面的【要点】总结

我把52条,稍微整理了一下,也算是,自己的一些想法吧,就是写着玩的,参考下就完事。

  第1条:了解Object-C语言的起源  -- 简单介绍,可以忽略的

  第2条: 在类的头文件中尽量少引入其他头文件 -- .h文件中,尽量用@class,少用#import  -- 降低耦合,稍微的提供编译效率

  第3条: 多用字面量语法,少用与之等价的方法 -- 直接赋值,就好了,不要总是  [xxx alloc] init], 多用下标方式访问。(这一条估计大家都会遵守,可以忽略)

  例如:

NSString str = @"111"     array[0] = @"111"     dict["age"] = 1

  第4条: 多用类型常量,少用#define预处理指令 -- #define定义出来相同的东西,系统不会报错。个人经历:我们在项目中,会吧宏定义在一个专门的文件中,这样方便管理

例如:  #define KTimeout 0.3 ==> static const NStimeInterval KTimeout = 0.3;

  第5条: 多用枚举

两种情况: true/false   两种以上: enum

  第6条: 理解 "属性" 这一概念  -- @property (nonatomic, assing/strong/weak/copy)

  第7条: 在对象内部尽量直接访问实例变量

  第8条: 理解 "对象等同性" 这一概念 -- isEqualToString / == 的区别

  第9条: 以 "类族模式" 隐藏实现细节 -- 封装方法,提供统一的对外访问接口

  第10条: 在既有类中使用关联对象存放自定义数据 -- 不理解,看官自己研究吧。哈哈哈

例如: objc_setAssociatedObject(xxx,xxx,...)

  第11 条: 理解 objc_msgSend的作用 -- 如题

  第12条: 理解消息转发机制 -- 如题

  第13条:用 "用方法调配技术" 调试 "黑盒方法" -- runtime 的一些用法

  第14条: 理解 "类对象" 的用意 -- isa 的简单解释

  第15条: 用前缀避免命名空间冲突 -- 在使用前缀时,尽量用三个字母以上,两个字母是苹果的预留,将来可能会有冲突

  第16条: 提供 "全能初始化方法" -- 基类,或者基础方法,所有方法都来调用它。我们可以在网络层,封装一个这样的方法,用来统一处理网络请求

  第17 条:实现description方法 -- 仁者见仁,自己在项目中貌似没有实现过这个方法, 更习惯 po model 来查看

  第18条: 尽量使用不可变对象 -- .h readOnly  .m readWrite   这样写更安全,大家可以试试看,我现在就在用这种方法

  第19条: 使用清晰而协调的命名方式 -- 好的方法明,等于注释。但是,国人的英语拼写出来的方法名,真的是。。。 个人建议: 适当注释,尤其是逻辑注释

  第20条: 为私有方法名加前缀  -- 好想法,但是总是忘记,哈哈哈,

例如: - (void) p_privateMethod

  第21条: 理解 Object-C 错误模型  -- 错误机制,可以看看

  第22条: 理解 NSCopying 协议 -- 如题

  第23条: 通过委托与数据源协议进行对象间通信  -- 典型的像 UITableviewDelegate/Datasource,另外在自己定义的时候,可以考虑用block

  第24条: 将类的实现代码分散到便于管理的数个分类之中 -- 瘦身,拆分,网上有好多方法

  第25条: 总是为第三方类的分类名称加前缀 -- 防止冲突

  第26条: 勿在分类中声明属性 -- 如题

  第27 条:使用 "class-continuation分类" 隐藏实现细节

例如: @interface Demo() {

        NSString *demoStr = @""

      }

            @end

  第28条: 通过协议提供匿名对象 -- 代理方式的运用

  第29条: 理解引用计数 -- ARC

  第30条: 以 ARC 简化引用技术 -- 如题

  第31条: 在 dealloc 方法中只释放引用并解除监听 -- 释放,通知,KVO,还可以测试循环引用

  第32条: 编写 "异常安全代码" 时留意内存管理问题 -- try{} catch{} finally{}

  第33条: 以弱引用避免保留环 -- 感觉翻译的不太好,其实就是解决 循环引用 问题

  第34条: 以 "自动释放池块" 降低内存峰值 -- 自己很少用 @autoreleassepoll ,理解下

  第35条: 用 "僵尸对象" 调试内存管理问题 -- 利用 xcode 自带工具检测

  第36条: 不用使用 retainCount -- 保留计数,用来查看某对象的计数器,貌似已经废除掉了

  第37 条:理解 "块" 这一概念 -- block 的各种优缺点与写法

例如: void (^myBlock)(int a, int b)

  第38条: 为常用的块类型创建 typedef -- 方便调用

例如: typedef int(^SuccessBlock)(BOOL flag, NSError *error)

SuccessBlock blcok = ^ (BOOL flag, NSError * err) { // do something};

- (void) doSomeThingWithCompletion:(SuccessBlock) completion

  第39条: 用 handler 块降低代码分散程度 -- block

  第40条: 用块引用其所属对象时不要出现保留环 -- 使用 block 时,避免循环引用  weakSelf

  第41条: 多用派发队列,少用同步锁 -- GCD

  第42条: 多用GCD,少用 performSelector 系列方法 -- 如题

  第43条: 掌握 GCD 及操作队列的使用时机 -- 如题

  第44条: 通过 Dispatch Group 机制,根据系统资源状况来执行任务 -- 可以看看,说不定哪一天突然用到了

  第45条: 使用 dispatch_once 来执行只需要运行一次的现成安全代码 -- 单例

  第46条: 不要使用 dispatch_get_current_queue -- 如题

  第47 条:熟悉系统框架 -- 忽略

  第48条: 多用块枚举,少用 for循环 --

  第49条: 对自定义内存管理语义的 collection 使用无缝桥接 -- Object-C 与 C 互相调用, __bridge

  第50条: 构建缓存时选用 NSCache 而非 NSDictionary -- NSCache 可以自动清除,线程安全

  第51条: 精简 initialize 与 load 的实现代码

  第52条: 别忘了 NSTimer 会保留其目标对象 -- 注意关闭计时器

呜呜,累死了,终于写完了,其实洗完发现也并没有什么用,就是自己写着玩而已,方便以后看的时候,通过一句话就想起来,要怎么做才好。

就先这样吧。闪啦

时间: 2024-08-24 14:47:57

Effective Objecttive-C 2.0的相关文章

sudo: effective uid is not 0, is sudo installed setuid root

当普通用户需要临时使用root权限的时候需要执行sudo命令,但是在执行sudo命令的时候需要使用root的权限去执行/usr/bin/sudo二进制文件. 如果报错出现sudo: effective uid is not 0, is sudo installed setuid root 证明/usr/bin/sudo文件没有设置s权限(用户在执行文件的时候,临时拥有文件所有者的权限.) 解决方法: chmod u+s /usr/bin/sudo 加上权限之后再查看文件 ll  /usr/bin

问题:sudo su: results -effective uid is not 0 is sudo installed setuid root

前段时间,新装的Centos运行sudo命令时出现的问题: sudo su: results -effective uid is not 0 is sudo installed setuid root 这是我在国外论坛上找到的解决办法 This another common problem for the new users for Linux. Anonymous change of permission of root or while experimenting we do run com

iOS 学习资料整理

视频教程(英文) 视频 简介 Developing iOS 7 Apps for iPhone and iPad 斯坦福开放教程之一, 课程主要讲解了一些 iOS 开发工具和 API 以及 iOS SDK 的使用, 属于 iOS 基础视频 iPad and iPhone Application Development 该课程的讲师 Paul Hegarty 是斯坦福大学软件工程学教授, 视频内容讲解得深入, 权威, 深受好评 Advanced iPhone Development - Fall

UNIX高级环境编程(3)Files And Directories - stat函数,文件类型,和各种ID

在前面的两篇,我们了解了IO操作的一些基本操作函数,包括open.read和write. 在本篇我们来学习一下文件系统的其他特性和一个文件的属性,涉及的函数功能包括: 查看文件的所有属性: 改变文件所有者: 改变文件权限: 操作文件夹. 我们还会了解一些文件系统相关的数据结构和符号链接(symbolic link). 1 函数stat.fstat.fstatat.lsat函数 #include <sys/stat.h> int stat(const char *restrict pathnam

YASM User Manual

This document is the user manual for the Yasm assembler. It is intended as both an introduction and a general-purpose reference for all Yasm users. 1.?Introduction Yasm is a BSD-licensed assembler that is designed from the ground up to allow for mult

美国政府关于Google公司2013年度的财务报表红头文件

请管理员移至新闻版块,谢谢! 来源:http://www.sec.gov/ 财务报表下载↓ 此文仅作参考分析. 10-K 1 goog2013123110-k.htm FORM 10-K UNITED STATES SECURITIES AND EXCHANGE COMMISSION Washington, D.C. 20549     FORM 10-K (Mark One)       ý ANNUAL REPORT PURSUANT TO SECTION 13 OR 15(d) OF TH

Go cron定时任务的用法

cron是什么 cron的意思就是:计划任务,说白了就是定时任务.我和系统约个时间,你在几点几分几秒或者每隔几分钟跑一个任务(job),就那么简单. cron表达式 cron表达式是一个好东西,这个东西不仅Java的quartZ能用到,Go语言中也可以用到.我没有用过Linux的cron,但网上说Linux也是可以用crontab -e 命令来配置定时任务.Go语言和Java中都是可以精确到秒的,但是Linux中不行. cron表达式代表一个时间的集合,使用6个空格分隔的字段表示: 字段名 是否

Notes for Apue &mdash;&mdash; chapter 4 Files and Directories(文件和目录)

4.1 Introduction 4.2 stat, fstat, fstatat, and lstat Functions The lstat function is similar to stat, but when the named file is a symbolic link, lstat returns information about the symbolic link, not the file referenced by the symbolic link. 4.3 文件类

UNIX高级环境编程(12)进程关联(Process Relationships)- 终端登录过程 ,进程组,Session

在前面的章节我们了解到,进程之间是有关联的: 每个进程都有一个父进程: 子进程退出时,父进程可以感知并且获取子进程的退出状态. 本章我们将了解: 进程组的更多细节: sessions的内容: login shell和我们从login shell启动的进程之间的关系. ? 一 终端登录(Terminal Logins) BSD Terminal Logins ?BSD终端的登录程序在过去35年都没有改变. 系统管理员(the system adminstrator)创建一个文件 /etc/ttys

VGA显示SDRAM内容_1&mdash;&mdash;DE1-SOC学习笔记(3)

在这篇文以及下面几篇文里里使用HPS-FPGA-Slave实现HPS读取一张bmp图片,发送至SDRAM,然后由自定义的IP读取SDRAM输出至VGA显示. 不妥当的地方还需多多指教 IP逻辑设计 VGA时序控制模块,选择mod控制输出不同的分辨率 //vga timing ctrl module // systemverilog // //by Sorin module vga_timctrl( input clk,//200MHz input [1:0] mod, //input rst,