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 引用的类,比如NSTextViewNSFont and NSColorSpace等

对于这些类,如果需要使用弱引用,unsafe_unretained 来修饰。但是它与weak 引用的区别在于,当unsafe_unretained指向的对象被回收后,其不被设为nil。

源自apple developer library

当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

原文地址:https://www.cnblogs.com/yeek/p/3484648.html