强弱财产有什么区别?

时间:2012-08-20 07:23:51

标签: iphone ios5 properties

iOS 5中的强弱属性是新的。 如果有人告诉我何时使用了哪个属性。

什么时候我们应该使用强者还是应该使用弱者?

@property(nonatomic,strong)

@property(nonatomic,weak)

4 个答案:

答案 0 :(得分:2)

strongretain类似,weakassign类似。主要区别在于weak属性在分配给它们的对象被释放时变为nil

例如:

@property (nonatomic, weak) id test;

...

- (void)example
{
    id foo = [[NSObject alloc] init];
    self.test = foo;
    foo = [[NSObject alloc] init];
    assert(self.test == nil);
}

答案 1 :(得分:2)

Strong表示只要此属性指向一个对象,该对象就不会自动释放。在非ARC中,它是retain的同义词。

相反,

Weak表示属性指向的对象可以自由释放,但前提是它将属性设置为nil。在ARC中,您使用weak来确保您不拥有它指向的对象。

答案 2 :(得分:2)

查看Automatic Reference Counting (ARC)

的Apple文档

如果您没有时间阅读它:

  

ARC为对象和弱引用引入了几个新的生命周期限定符。弱引用不会延长它指向的对象的生命周期,并且在没有对该对象的强引用时自动变为nil。

     

是默认值。只要存在指向它的强指针,对象就会保持“活着”。

     

指定不使引用对象保持活动状态的引用。当没有强弱时,弱引用设置为nil   对象的引用。

由于iOS 5 ARC自动使弱链接无效,因此在卸载对象时,其对象层次结构将自动设置为nil。由于这个原因,Weak是所有outlet属性的推荐关系。这些视图对象已经是视图控制器视图层次结构的一部分,不需要在其他地方保留。声明你的网点薄弱的一大优势是它可以节省你编写viewDidUnload方法的时间。

查看引用memory management的非常详细的文件。它是ARC之前的版本,但它可以帮助您理解内存管理。属性的retain关键字仍然适用于ARC,只是strong的同义词。或另一个特定的ARC tutorial

答案 3 :(得分:0)

强弱之间存在以下差异。

1.如果我们声明变量强,那么它不会被编译器解除分配,直到内存中的Application实例。当我们将nil值设置为该引用时,它会被编译器解除分配,默认情况下任何局部变量都是强变量。 例如:- var str =" hello world"

如果我们设置str = nil则将其解除分配。

2.如果我们将变量声明为强,那么它将被其他实例(Class)保留,并且它会将计数增量保留为1.

财产薄弱。

1.当我们声明弱属性时,它只包含数据/实例地址,直到强引用在内存中,如果强大的变量引用被释放它自动设置为nil。

对于前: - var str =" hello world" weak var stringVar = str

假设str包含200个堆地址,我们设置str = nil,然后由编译器自动将弱属性引用设置为nil。

这就是stoary board ref controller的原因,主视图只设置为strong而其他设备都很弱 - 我们可以看到UIButton,UILabel out e.t.c。