4,delegate使用什么修饰?使用assign和weak的区别?

使用weak进行修饰,对代理对象进行弱引用,避免循环引用的发生。有些开发者认为也可以使用assign修饰delegate,但事实并非如此。

区别:
assign适用于基本数据类型,weak适用于NSObject对象,并且是一个弱引用。
assign其实也可以用来修饰对象,那么我们为什么不用它呢?
因为被assign修饰的对象在释放之后,指针的地址还是存在的,也就是说指针并没有被置为nil,成为野指针。如果在后面的操作中又用到了这个野指针,则会导致程序崩溃。
而weak修饰的对象在释放之后,指针地址会被置为nil。对空对象发送消息,程序是不会崩溃的。
所以现在一般弱引用就是用weak。

验证:

方法一:自定义对象,实现dealloc方法,观察dealloc方法是否被调用

@implementation Person

* \(void\)dealloc {
    NSLog\(@"Person对象释放"\);
  }
  @end
  \`\`\`

##### 方法二:观察对象的值

**注意:**  
NSString对象比较特殊。  
对于NSString对象,assign和weak的结果是一样的

@property (nonatomic, assign) NSString str1;
@property (nonatomic, weak) NSString
str2;

self.str1 = @"111";
self.str2 = @"222";
NSLog(@"%@ == %@", self.str1, self.str2);

输出结果:
111 == 222


非NSString对象

@property (nonatomic, assign) NSObject obj1;
@property (nonatomic, weak) NSObject
obj2;

self.obj1 = [NSObject new];
self.obj2 = [NSObject new];
NSLog(@"%@ == %@", self.obj1, self.obj2); ```

结果:

程序运行会导致奔溃。断点查看self.obj1self.obj2对象的值,self.obj2被置为nil了。

results matching ""

    No results matching ""