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 的修饰符总结如下:

page19image1256
  • strong:等同于"retain",属性成为对象的拥有者

  • weak:属性是 weak pointer,当对象释放时会自动设置为 nil,记住 Outlet

    应该使用 Weak

  • unsafe_unretained:等同于之前的"assign",只有 iOS 4 才应该使用

  • copy:和之前的 copy 一样,复制一个对象并创建 strong 关联

  • assign:对象不能使用 assign,但原始类型(BOOLintfloat)仍然

    可以使用 

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高级指南,以后再看。

posted @ 2013-03-07 12:50  不想当元帅的好兵。  阅读(371)  评论(0编辑  收藏  举报