ARC
Objective-C 属性特性(assign , retain , copy , readonly , readwrite , atomic , nonatomic)
assign:指定setter方法用简单的赋值,这是默认操作。你可以对标量类型(如int)使用这个属性。你可以想象一个float,它不是一个对象,所以它不能retain、copy。
retain:指定retain应该在后面的对象上调用,前一个值发送一条release消息。你可以想象一个NSString实例,它是一个对象,而且你可能想要retain它。
copy:指定应该使用对象的副本(深度复制),前一个值发送一条release消息。基本上像retain,但是没有增加引用计数,是分配一块新的内存来放置它。
readonly:将只生成getter方法而不生成setter方法(getter方法没有get前缀)。
readwrite:默认属性,将生成不带额外参数的getter和setter方法(setter方法只有一个参数)。
atomic:对于对象的默认属性,就是setter/getter生成的方法是一个原子操作。如果有多个线程同时调用setter的话,不会出现某一个线程执行setter全部语句之前,另一个线程开始执行setter的情况,相关于方法头尾加了锁一样。
nonatomic:不保证setter/getter的原子性,多线程情况下数据可能会有问题。
1.Automatic Reference Counting 自 动引用计数
2.在项目中使用 ARC 是非常简单的,所有的编程都 和以前一样,除了你不再调用 retain, release, autorelease。
3.注意 ARC 是编译器特性,而不是 iOS 运行时特性(除了 weak 指 针系统)
4.我们称 firstName 和 textField.text 指针为“strong”,因为它们能够保 持对象的生命。默认所有实例变量和本地变量都是 strong 类型的指针。
5.另外还有一种“weak”指针,weak 变量仍然指向一个对象,但不是对 象的拥有者:
__weak NSString *weakName = self.textField.text;
weakName 变量和 textField.text 属性都指向一个 String 对象,但 weakName 不是拥有者。如果文本框的内容发生变化,则原先的 String 对象就没有拥有者,会被释放,此时 weakName 会自动变成 nil,称为 “zeroing” weak pointer:
6.变量默认就是__strong 类型
7.
属性可以是 strong 或 weak,写法如下:
@property (nonatomic, strong) NSString *firstName;
@property (nonatomic, weak) id <MyDelegate> delegate;
8.delegate 和 Outlet 应该用 weak 属性来声明。同时,如上一回介绍的 iOS 5 之前的版本是没有 __weak 关键字的,所以 weak 属性是不能使用的。这种情况我们使用 unsafe_unretained。
9.copy
与 strong 的区别是声明变量是拷贝对象的持有者。
10.
属性 property
对于.h 头文件,Xcode 主要是将属性定义由 retain 变为 strong,这些属性 是类对外的接口,因此定义在.h 文件中:
@property (retain, nonatomic)
变为
@property (strong, nonatomic)
在 ARC 之前,开发者经常会在.m 实现文件中使用 class extension 来定义 private property,如下:
这样做主要是简化实例对象的手动内存管理,让 property 的 setter 方法自 动管理原来对象的释放,以及新对象的 retain。但是有了 ARC,这样的代码就不 再需要了。
一般来说,仅仅为了简化内存管理,是不再需要使用 property 的, 虽然你仍然可以这样做,但直接使用实例变量是更好的选择。只有那些属于 public 接口的实例变量,
才应该定义为 property。
我们可以直接在.m 类实现中定义 private 实例变量:
@implementation MainViewController
{
NSMutableString *currentStringValue;
NSMutableArray *searchResults;
SoundEffect *soundEffect;
}
我们在使用时,虽然没有定义 property,也可以直接
[self.soundEffect play];
如果你觉得这很别扭,也可以使用
[[self soundEffect] play];
如果你还是觉得应该定义 property,那就定义一个吧,反正也没什么害处。
作为 property 的最佳实践,如果你定义某个东西为 property,则你应该在 任何地方都按属性来使用它。唯一例外的是 init 方法、自定义的 getter 和 setter 方法。
因此很多时候我们会这样写 synthesize 语句:
@synthesize propertyName = _propertyName;
实际上_propertyName 实例变量甚至可以不定义,编译器会自动为 property 定义 "_*" 的实例变量
11. p18
IBOutlet
在 ARC 中,所有*outlet*属性都推荐使用 weak,这些 view 对象已经属于 View Controller 的 view hierarchy,
不需要再次定义为 strong(ARC 中效果等同于 retain)。
viewDidUnload()方法里面需要设置所有非 outlet 变量为 nil,同样还有 didReceiveMemoryWarning()方法。
12. p19
property 的修饰符总结如下:
-
strong:等同于"retain",属性成为对象的拥有者
-
weak:属性是 weak pointer,当对象释放时会自动设置为 nil,记住 Outlet
应该使用 Weak
-
unsafe_unretained:等同于之前的"assign",只有 iOS 4 才应该使用
-
copy:和之前的 copy 一样,复制一个对象并创建 strong 关联
-
assign:对象不能使用 assign,但原始类型(BOOL、int、float)仍然
可以使用
13.(不理解)
14.
dealloc 方法
另外启用 ARC 之后,dealloc 方法在大部分时候都不再需要了,因为你不能 调用实例对象的 release 方法,也不能调用[super dealloc]。假如原先的 dealloc 方法只是释放这些对象,Xcode 就会把 dealloc 方法完全移除。你不再 需要手动释放任何实例变量。
如果你的 dealloc 方法处理了其它资源(非内存)的释放,如定时器、Core Foundation 对象,则你仍然需要在 dealloc 方法中进行手动释放,如 CFRelease(), free()等。这时 Xcode 会保留 dealloc 方法,但是移除所有的 release 和[super dealloc]调用。如下:
- (void)dealloc
{
AudioServicesDisposeSystemSoundID(soundID);
}
15.(不懂) block
16.p21 -p24 不懂
Toll-Free Bridging
17 .
ARC 主要是 LLVM 3.0 编译器(而不是 iOS 5)的新特性,因此你也可以在 iOS 4.0之后的系统中使用ARC,不过需要注意的是,weak 指针需要iOS5才能使用。
18.未看完,第三部分ARC高级指南,以后再看。