iOS开发 入门学习总结(二)Objective-C 语法特性总结
Objective-C Encapsulating Data
01. atomic // default02. nonatomic
03. strong=retain // default04. weak= unsafe_unretained
05. retain
06. assign // default07. unsafe_unretained
08. copy
09. readonly
10. readwrite // default
1.nonatomic
在Objective-C 中定义的properties 默认是atomic,当然可以通过nonatomic 修饰取消其原子性,带来的好处就是acess nonatomic properties更快。
我发现绝大多数定义在.h文件中定义的property都需要设定成nonatomic。以后需要注意的是哪些property 是不能设置为nonatomic。
注意:atomic 并不意味着线程安全。
2. readonly,readwrite (默认)
#.h文件中
@property (readonly) NSUInteger answeredQuestions;
#.m 文件中定义
@property (readwrite) NSUInteger answeredQuestions;
这个技巧是为了隐藏信息。
readonly 通知编译器,生成public getter方法,不提供public setter 方法,只对内提供setter 方法。
3 const 变量
.h文件定义在@interface 前面的const 修饰的变量
extern NSString * const QuestionsListKey; extern NSString * const QuestionTextKey; extern NSString * const AnswerTextKey; extern NSString * const AnswerKey;
.m 对在这些变量进行赋值
NSString * const QuestionsListKey = @"QuestionList"; NSString * const QuestionTextKey = @"QuestionText"; NSString * const AnswerTextKey = @"AnswerText"; NSString * const AnswerKey = @"Answer";
这就类似C/C++ 中的宏。这些都是只读,如果试图对其修改,编译器会报错。
4 category。
声明关于某个类的 category,那么所有该类的实例都具有这个category中添加的方法(当然前提是,import 该category)。
category 可以用来添加类方法,或实例方法,但是不太适合用来添加property(用来添加property最好的实现是继承,如果需要添加property,那么我们需要新的类型来实现,此时更好的OO 实现是继承)。
category 另一作用:可以运用于将复杂类的实现分解在多个源文件中。
Best practise:为避免category 命名冲突,可以在方法前面添加三个字母的前缀。
5.@class 与import 区别
@class XYZ 仅仅告诉编译器 XYZ 这是个类,但是编译器完全不知其内部的构造。 即使不存在这个XYZ类,可以通过编译
import “XYZ.h” XYZ 内部的任何的method 和property 对于编译器都是透明的。
6.@synthesize
当我们需要直接 access 实例变量时,需要用下划线作为前缀。以用来区分这是实例变量而非局部变量。
synthesize关键字的作用:
@synthesize instanceVaraible = se_instanceVaraible , 那么此时实例变量就是se_instanceVaraible 而不是_instanceVaraible;
@synthesize firstName,那么实例变量就变成 firstName;
7.Objective-C 内存对象管理
Objective-C内存管理大部分是基于automatic reference counting (ARC),应该避免出现环形强引用,因为这会导致内存泄漏。
ARC 回收机制特点:精度低(无法处理环形引用),执行效率高。除Objective-C runtime 之外 COM模型也采用ARC管理构建。
另外一种回收机制,采用有向图的方法从main 函数开始遍历heap中的对象,回收那些不可达的对象。其精度高,但是效率低。
环形强引用
此时NSTableView 和Delegate 没有外部强引用指向这两者,这两者应该被回收,但是因为Objective-C 的内存管理是基于ARC,那么当出现环形强引用时,无法回收,造成内存泄漏。当然这也是ARC回收机制的弊端。
可以通过使用weak 引用来避免环形强引用。(注意:Cocoa and Cocoa Touch中存在少数不支持weak 引用的类,比如NSTextView
, NSFont
and NSColorSpace等
)
对于这些类,如果需要使用弱引用,unsafe_unretained 来修饰。但是它与weak 引用的区别在于,当unsafe_unretained指向的对象被回收后,其不被设为nil。
当Delegate 被Deallocated,指向Delegate的 weak 引用被自动设成nil。
8.copy 关键字
很好理解,在堆中维持对象的一个拷贝,任何对原来对象的改变都不会对copy对象产生影响。
被设置成copy的对象,必须要支持NScopying protocol。
//相关神贴:
http://stackoverflow.com/questions/322597/class-vs-import?rq=1
http://stackoverflow.com/questions/588866/atomic-vs-nonatomic-properties