美文网首页
iOS Delegate使用assign修饰崩溃(应使用weak

iOS Delegate使用assign修饰崩溃(应使用weak

作者: 心猿意码_ | 来源:发表于2022-05-24 15:20 被阅读0次
问题描述:

Delegate使用assign修饰是产生崩溃。

原因:
  • weak:指明该对象并不负责保持delegate这个对象,delegate的销毁由外部控制。当delegate指向的对象销毁后,自动delegate = nil

  • assign:是指针赋值,不对引用计数操作,使用之后如果没有置为nil,可能就会产生野指针。即便delegate指向的对象销毁了,delegate中依然会保存之前对象的地址,即delegate成为了一个野指针。

为什么用weak不用assign
  • assign是指针赋值,不操作引用计数,delegate用完后如果没有设置为nil,有可能产生野指针。
  • weak指向的delegate一旦用完,自动就nil了,不会产生野指针。
示例代码如下:

Book文件

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN
@protocol TestlDelegate <NSObject>

@optional

-(void)testDelegate:(NSString *)str;

@end

@interface Book : NSObject
@property (nonatomic,assign) id <TestlDelegate> delegate;

-(void)test;
@end

NS_ASSUME_NONNULL_END

#import "Book.h"

@implementation Book
-(void)test{
    if(self.delegate && [self.delegate respondsToSelector:@selector(testDelegate:)]){
        [self.delegate testDelegate:@"我是一条测试回调"];
    }
}
@end

Store文件

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface Store : NSObject

@end

NS_ASSUME_NONNULL_END

#import "Store.h"

@interface Store ()

@end

@implementation Store

@end

ViewController中调用


#import "ViewController.h"
#import "Book.h"
#import "Store.h"

@interface ViewController ()<TestlDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor orangeColor];
    Book *book = [[Book alloc] init];
    
    {    //从作用域出去后store就会释放,此时delegate并未释放或置为nil,成为了一个野指针,所以再调用 [book test]; 时崩溃
        Store *store = [[Store alloc] init];
        book.delegate = store;
    }
    
    [book test];
}

@end

总结:store从作用域出去后,store就会释放,此时delegate并未释放或置为nil,成为了一个野指针,所以再调用 [book test];时崩溃,将assign改为weak则可解决此崩溃问题。

相关文章

  • iOS Delegate使用assign修饰崩溃(应使用weak

    问题描述: Delegate使用assign修饰是产生崩溃。 原因: weak:指明该对象并不负责保持delega...

  • IOS

    一、Delegate为什么要用weak或者assign修饰,不能用strong?说明:weak、assign修饰的...

  • iOS weak和assign的区别

    weak和assign的区别-正确使用weak、assign 脑海里只有weak修饰引用类型 assin 修饰基本...

  • iOS开发中 weak和assign的区别

    weak和assign的区别-正确使用weak、assign 一、区别 1.修饰变量类型的区别weak 只可以修饰...

  • 需要了解的基础知识点

    一、weak和assign有什么区别 修饰delegate的属性是weak还是assign比较好? 答:assig...

  • ios面试

    delegate 为啥assign weak修饰 一般使用代理都会设置控制器为代理,在内存管理角度说引用计数会加...

  • 内存管理相关

    一、ARC管理内存是使用assign还是weak? assign: 可以修饰基本数据类型,也可以修饰对象。修饰代理...

  • 在ARC中为啥要用weak修饰弱引用

    weak和assign的区别 weak只能用来修饰对象,使用weak修饰的对象的默认值是nil,不能用来修饰基本数...

  • runtime之weak指针的实现

    我们经常写delegate ,修饰有weak指针,而不用assign,这是因为用weak指针不会,在delegat...

  • 类属性设置与修饰词

    Delegate修饰词 Delegate为了防止循环引用一般用weak和assign修饰,但这两者是有区别的,比如...

网友评论

      本文标题:iOS Delegate使用assign修饰崩溃(应使用weak

      本文链接:https://www.haomeiwen.com/subject/ugbjprtx.html