项目崩溃简单总结

- 数组类型

 

越界访问会crash

- 字典类型


查询时

~~~objective-c

- (nullable ObjectType)objectForKey:(KeyType)aKey;

~~~

keynil。能够正常运行。

插入时

~~~objective-c

- (void)setObject:(ObjectType)anObject forKey:(KeyType <NSCopying>)aKey;

~~~

插入时objectkey任一为nil,都会crash


- 字符串类型


获取substring,越界访问会crash.

包括:

~~~objective-c

- (NSString *)substringFromIndex:(NSUInteger)from;

- (NSString *)substringToIndex:(NSUInteger)to;

- (NSString *)substringWithRange:(NSRange)range;  

~~~


##2. 访问悬挂指针(Dangling pointer


悬挂指针,通常也被称为野指针。野指针,指的是指向不正确内存的指针。如果我们访问了不正确的内存,则会导致Crash


那么什么情况下会导致野指针呢?


- 访问了已被release,但尚未置空的指针


MRC时代,如果我们提前释放了对象,并且没有把对象置空,再访问这个对象,则会Crash

~~~objective-c

Person *mango = [[Person alloc]init];

[mango release]; //object此时为野指针

[mango setName:@"mango"]; // Crash:访问了野指针

//正确做法

Person *mango = [[Person alloc]init];

[mango release] //object此时为野指针

mango = nil;

[mango setName:@"mango"]; //nil发送消息,没有问题

~~~


ARC时代,编译器会我们进行引用计数的管理。声明为strong,weak的属性,在对象引用计数为零后,自动释放内存,同时将指针置为nil

那是否就万事大吉了呢。

事实上由于历史原因,UIKit等官方框架里,许多delegate还是声明为assgin而不是weak(Apple:其实是我懒得改了 )

声明为assginunsafe_unretained的对象,内存被释放后,编译器不会自动将指针置为nil

`NSNetServices`delegate,官方的头文件是这样:


~~~objective-c

@property (assign) id <NSNetServiceBrowserDelegate> delegate;

~~~

类似这样声明的delegate,如果delegate提前被释放,但是我们没有帮助官方的类将delegate置空,如果此时官方的类需要调用到delegate,则同样会造成Crash

解决方案

遇到这种旧时代的官方delegate,为了安全起见,我们在deallocdelegate置为nil

~~~objective-c

- (void)setService:(NSNetService *)service

{

    _service = service;

   

    self.service.delegate = self;

    [self.service resolveWithTimeout:5];

}

- (void)dealloc

{

    // 避免悬挂指针

    self.service.delegate = nil;

}

~~~


##3. 为不可为空的函数参数赋值nil


例如:

~~~objective-c

- (NSString *)stringByAppendingString:(NSString *)aString

//aString:

//The string to append to the receiver. This value must not be nil


//NSNotificationCenter

- (void)postNotification:(NSNotification * _Nonnull)notification

//notification

//The notification to post. This value must not be nil.


等等......


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值