他们都可以用来标明一种非拥有的弱引用关系,但是week属性修饰的变量,在该变量被销毁之后,此weak变量的值会自动被赋值为nil。而assign属性一般是对C基本数据类型成员变量的声明,当然也可以用在对象类型成员变量上,只是其代表的意义只是单纯地拷贝所赋值变量的指针。即如果对某assign成员变量B赋值某对象A的指针,则此B只是简单地保存此指针的值,且并不持有对象A,也就意味着如果A被销毁,则B就指向了一个已经被销毁的对象,如果再对其发送消息会引发崩溃。
简单理解就是:week修饰的变量,在变量被销毁之后会自动赋值为nil,而assign修饰的变量,它保存的是某个指针的值,若保存的对象被销毁则,该变量就指向了一个被销毁的对象,再向其发送消息会引起崩溃。
PS:关于循环引用,对于过去那些使用assign属性的地方,在ARC环境中要使用weak代替。大部分引用循环是由委托(delegate)引起的,所以应该总是把delegate属性声明为weak。当引用的对象被销毁之后,weak引用会被自动置为nil,与assign相比这是一个巨大的进步,因为assign可以指向被释放掉的内存,导致程序崩溃。