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.obj1
和self.obj2
对象的值,self.obj2
被置为nil了。