Effective Objective-C手记

类型常量:使用类型常量代替#define

1. 普通常量

//.m
#import "xxxxx.h"
static const NSTimerInterval kAnimationDuration = 0.3; //放在.m文件的#import之后即可,常量名称以k开头。
@implemenation xxxxx
@end

2. 公开常量

//注意不同类型的写法,最好以类名作为前缀。
//xxxxx.h
extern NSString *const xxxxxStringConstant;
extern const NSTimerInterval xxxxxAnimationDuration;

//xxxxx.m
NSString *const xxxxxStringConstant = @"VALUE";
const NSTimerInterval xxxxxAnimationDuration = 0.3;

枚举类型的声明:用NS_ENUM代替普通枚举,用NS_OPTIONS代替定义选项的枚举

1. NS_ENUM和普通枚举的写法

//声明一个EOCConnectionState枚举
typedef NS_ENUM(NSUInteger, EOCConnectionState) {
    EOCConnectionStateDisconnected,
    EOCConnectionStateConnecting,
    EOCConnectionStateConnected,
};

//传统写法:
enum EOCConnectionState : NSUInteger {
    EOCConnectionStateDisconnected,
    EOCConnectionStateConnecting,
    EOCConnectionStateConnected,
};
typedef enum EOCConnectionState EOCConnectionState;

2. NS_OPTIONS和定义选项枚举的写法

//声明一个EOCPermittedDirection选项枚举
typedef NS_OPTIONS(NSUInteger, EOCPermittedDirection) {
    EOCPermittedDirectionUp,
    EOCPermittedDirectionDown,
    EOCPermittedDirectionLeft,
    EOCPermittedDirectionRight,
};

//传统写法:
enum EOCPermittedDirection: NSUInteger {
    EOCPermittedDirectionUp     = 1 << 0,
    EOCPermittedDirectionDown   = 1 << 1,
    EOCPermittedDirectionLeft   = 1 << 2,
    EOCPermittedDirectionRight  = 1 << 3,
};
typedef enum EOCPermittedDirection EOCPermittedDirection;

属性特质:原子性、读写权限、内存管理语义、方法名

1. 原子性:
atomic或者不写,表示使用同步锁;
nonatomic,表示不使用同步锁。

2. 读写权限:
readwrite,同时拥有getter和setter方法;
readonly,只有getter方法。该属性由@synthesize实现,编译器才会自动生成相应的getter、setter。

3. 内存管理语义:
assign,对简单类型的赋值操作。
strong,强类型。weak,弱类型。
unsafe_unretained,与weak不同的是,当对象被销毁时,属性值不会自动被清空。
copy,与strong不同的是,设置方法不会保留新值,而是将其拷贝。NSString*的新值可能被指定为NSMutableString的实例,为防止此属性值被修改,新值可能为mutable的对象的,都应该copy。

//若声明copy特质的属性
@property (copy) NSString *title;

//在实现自定义的初始化方法时,也要遵从copy
_title = [aNSString copy];

/* 注意:其他的特质也是同样道理。 */

4. 方法名:
getter=<name>,指定getter方法名,如果属性是Boolean型,可以指定is前缀,如: @property (noatomic, getter=isOn) BOOL on; 
setter=<name>,指定setter方法名,不常用。

-

时间: 2024-10-10 06:08:24

Effective Objective-C手记的相关文章

读Effective Objective C总结(一)

第一章 Objective C是一种基于消息结构的语言,在查找执行的方法和对象时是在运行时处理 对象的空间分配在堆空间,指向对象的指针分配在栈空间,基本数据类型和结构体也分配在栈空间 在引入头文件时,尽量使用@Class前向声明来提高编译效率 多使用字面量语法,但是在取下标的时候,要注意是否有意义 少使用#define预处理指令,若要在一个文件(当前单元)里使用静态常量,应该这样声明:static const NSTimeInterval kTime,但是这种方法并不能用OC的方法初始化,即必须

读Effective Objective C总结(二)

OC编译器的特性:在声明成员变量时,编译器会产生一个硬编码的偏移量,它表示变量距离存放该对象的内存区域的起始地址的长度.OC把这个偏移量作为类对象的一个特殊变量,在runtime时期查找,就总可以生成正确的偏移量. @property 属性:在没有进行任何手动操作的前提下,这个属性第一自动生成了getter和setter方法,同时生成了对应属性"_字段"的成员变量 @property中内存管理的语义: 4.关于使用点语法的原则:在初始化方法或者dealloc中,要用成员变量,不要用点语

Effective Objective -C 第一章 熟悉iOS

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

读Effective Objective C总结(三)

在collection集合类中如NSSet中是不允许有相同的元素的,但是如果这样写: 这样就会第一个set的输出结果是两个相同的元素,第二个set的输出结果只有一个元素 类族模式:由于在OC中没有抽象基类,因此用工厂模式,比如我们可以用创建UIButton类似的方法:判断某个实例所属的类是否在类族之中,要用isKindOfClass不能用isMemeberOfClass,因为有些类会有内部类型 关联对象的使用,实际上就是在局部空间建立一个通道来共享某些类,如在UIAlert里面共享block 消

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

iOS开发总结(A0)- Class, variable, enum, method 命名规范及好的做法

参考effective objective 2.0 item 19 use clear and consistent naming 中的建议 1. method name : 适用驼峰命名法,方法名称应尽能表明方法是干什么的,不必担心名称过程,因为在使用时,xcode 会自动补全 - 如果method返回一个值,方法名称应表明这是什么值 - 不要用缩写 - 对于boolean property ,加上is 或者has 前缀 - 不要使用get 前缀 - 名称应易读,尽量像一个自然句子 2. cl

Xcode常见报错解决办法

这里总结了几个常见的Xcode报错以及解决办法,希望对大家学习Xcodehttp://www.maiziedu.com/course/234/有所帮助. 1. 死存储问题 CocoaChina CocoaChina CocoaChina 这个问题上篇文章提到过,之所以重新罗列出来,是因为这个问题也挺常见的.导致这个问题的原因是,当我们对某个对象直接赋值之后,如果包含这个对象的方法立马就结束了,那么这个对象就会被自动释放,但是我们本身根本还没有用到它,所以就形成了一个死存储代码,这个赋值语句其实也

让代码更帅一点

博主的私人博客 写代码最重要的是实现功能,但是除了实现功能之外,我们还应该想办法,让代码变得更规范,更漂亮 最近在读<禅与Objective-C编程艺术>和<Effective Objective C 2.0:编写高质量iOS与OS X代码的52个有效方法>,这两本都讲解了代码规范方面的东西,结合自己平时的代码习惯,发现有很多地方自己做的还是不够好,代码写得不够帅,所以总结一下,让以后的代码更帅一点 条件语句 条件语句一定要使用括号,如果不使用括号,if后面的那行代码删除,之后的代

iOS开发总结(A0)- #define 与 const

什么时候用#define ,什么时候用const ? effective objective c item4 中这样说: Prefer Typed Constants to Preprocessor #define 1. 避免 #define. 因为无类型信息,且可能会redefined 2. 在m文件中定义为 static const(实际上这种处理和#define一样) 3. 对于global constants,应在头文件中申明,在相关的m文件中定义,前缀为响应的类名称 如在.h 中, e

iOS 学习资料

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