ios系统ios 断言 用法是什么意思

iOS断言-抛异常 - 简书
iOS断言-抛异常
1.什么是断言?
断言本质只是一个宏NSAssert(condition, desc),当表达式(condition)为真时,程序继续运行,如果表达式为假,那程序就会停止运行,并提示错误信息(desc)
2.应用场景:
用于开发阶段调试程序中的Bug,通过为NSAssert()传递条件表达式来断定是否属于Bug,满足条件返回真值,程序继续运行,如果返回假值,则抛异常,并切可以自定义异常描述。NSAssert()是这样定义的:
#define NSAssert(condition, desc)
3.什么是抛异常?
自定义描述异常信息的desc就是所谓的抛异常
注意:assert是一个宏,只在debug版本中起作用,在release版本中,该语句是不起任何作用的。
示例一:给图片属性赋值不能为空,添加断言,如果为空,则直接crash,抛异常
@interface ViewController ()
@property (nonatomic,weak) UIImage *
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIImageView *imageView = [[UIImageView alloc] init];
imageView.frame = CGRectMake(100, 100, 200, 200);
[self.view addSubview:imageView];
self.icon = [UIImage imageNamed:@""];
imageView.image = self.
- (void)setIcon:(UIImage *)icon
NSAssert(icon != nil , @"图片不能为空" );
报错示例图:
- (void)touchesBegan:(NSSet&UITouch *& *)touches withEvent:(UIEvent *)event
BOOL isOn = NO;
NSAssert(isOn, @"如果表达式是假,直接报错");
利用宏自定义断言
DXAssertNil(a,b,...)
NSAssert((a)==nil,(b))
DXAssertNotNil(a,b,...)
NSAssert((a)!=nil,(b))
DXAssertTrue(a,b,...)
NSAssert((a),(b))
DXAssertEquals(a,b,c,...)
NSAssert((a==b),(c))
DXAssertNotEquals(a,b,c,...)
NSAssert((a!=b),(c))
github地址:/dongxiexidu
1、什么是NSAssert? NSAssert ,断言,其实是一个宏,主要用于开发阶段调试程序,在真机中将会自动忽略。通过为NSAssert()传递条件表达式来断定是否属于Bug,满足条件返回真,程序继续运行。如果返回假,则抛出异常,并且可以自定义异常描述。 断言其实是“防...
Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调导致了样板模式, 使用Spring Cloud开发人员可以快速地支持实现这些模式的服务和应用程序。他们将在任何分布式...
NSAssert()介绍 NSAssert()是一个宏,用于开发阶段调试程序中的Bug,通过为NSAssert()传递条件表达式来断定是否属于Bug,满足条件返回真值,程序继续运行,如果返回假值,则抛出异常,并且可以自定义异常描述。 NSAssert() 定义#define...
什么是断言 在程序设计中,断言(assertion)是一种放在程序中的一阶逻辑(如一个结果为真或是假的逻辑判断式),目的是为了标示与验证程序开发者预期的结果-当程序运行到断言的位置时,对应的断言应该为真。若断言不为真时,程序会中止运行,并给出错误消息。 使用断言 用错误处理...
一直想写一篇你关于断言的文章, 今天有时间赶紧写出来.参考 Mattt 文章 一、Objective - C 中的断言: Objective - C 中的断言处理使用的是 NSAssertionHandler : 每个线程拥有它自己的断言处理器,它是 NSAssertion...
下雨了。 从上午的时候就天色阴暗,明明知道今天免不了一场雨,就期待着,不要是太大的雨,好似以前晚上出去上自习,一出门,道路上的积水竟能够够得着小腿了。我替我新穿的皮鞋感到担心,它们因为跟有一些高,偶尔才会穿在脚上。如果不幸要被水淹了,就可惜了。 下起来的时候才知道是细雨,温...
新爸五年计划|童言o把妈妈升上天空 今天早上吃饭时候,诺子突然说:“妈妈,我想把你升上了天空,玩一玩你,就像风筝那样。”过了一会,又说:“还是不把你升上天空可把,太沉了但是。”这是在说他妈妈胖吗?哈哈。 今天下午跟诺子去浅水泳池里玩了很长时间,玩了一会他说冷想回家,但又玩着...
“闭嘴,请你不要随便打扰我的幸福。 1 儿子考上大学,虽然是普通大学,但全家都为他骄傲。 他爸对他说:我只上了四年级,你妈没读书,我们家能有你一个大学生,我们都为你感到骄傲。 结果隔壁邻居来敲门,说是自己的儿子考上名牌大学,四处给人派喜糖,庆贺自己的儿子有出息,以后毕业出来...
今天有人提问,为什么90后把频繁跳槽当成事业?听到这个问题,我不禁发笑。 没有人会把跳槽当成事业,正如没有人把离婚当成梦想一样。 为什么会跳槽? 人是群居动物,寻找合适的群体并融入进去是一种本能的天性。也就是说,脱离稳定的群体,是一种有悖于人类本性的行为,通俗的说,就是逆天...
整理自 PHP 标准规范 作为程序员来说,采用统一的编码风格是非常重要的。这将给未来代码的编写、阅读节省大量时间。这里整理一份自己的 PHP 编码规范。 动词说明: 必须:严格遵守; 禁止:一定不能这样做; 应该:强烈建议这样做,但不强求; 不该:强烈建议不这样做,但不强求...相关文章推荐
断言(assertion)是指在开发期间使用的、让程序在运行时进行自检的代码(通常是一个子程序或宏)。断言为真,则表明程序运行正常,而断言为假,则意味着它已经在代码...
上一篇文章简单介绍了OCUnit和GHUnit两款iOS开发中较为常见的单元测试框架,本文进一步介绍单元测试中的另一利器——匹配引擎(Matcher
Engine)。匹配引擎可以替代断言方法,配合...
断言(assertion)是指在开发期间使用的、让程序在运行时进行自检的代码(通常是一个子程序或宏)。断言为真,则表明程序运行正常,而断言为假,则意味着它已经在代码中发现了意料之外的错误。断言对于大型...
本博文转自:http://blog.csdn.net/univcore/article/details/
声明:本文乃作者UnivCore原创博客,如若转载,转载时请...
断言assert用做处理的开发期的错误,它是程序员的调试工具,在release代码的时候,assert是会移除的,所以,assert用来检查
程序员的错误。如果你的程序模块化做得好,用assert可...
一、Objective - C 中的断言:
Objective - C 中的断言处理使用的是 NSAssertionHandler :
每个线程拥有它自己的断言处理器,它是 NSAssertio...
一、Objective-C 中的断言:
Objective-C 中的断言处理使用的是 NSAssertionHandler :
每个线程拥有它自己的断言处理器,它是 NSAsserti...
断言(Assert):
在程序设计中,断言(assertion)是一种放在程序中的一阶逻辑(如一个结果为真或是假的逻辑判断式),目的是为了标示与验证程序开发者预期的结果-当程序运行到断言的位置时,对...
DLog(@"-----%@",@"自己添加的");
控制台输出:
[文件名:/Users/lambo/Desktop/‰???+????/?AE???(R)????ú?/?AE??...
函数与方法、枚举等的书写格式与用法还是变化很大的。
1.1 无返回值, 无形参
func myTest2(){
println("Hello")
1.2 有返回值,有形参
他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)在看到xmpp项目中的一些代码时,看到如下,不懂该代码是啥意思,
NSAssert(_xmppStream == nil, @“XMPPStream被重复实例化!“);
一查,其实很简单:就是一个断言而已
在网上很多blog讲的很详细,在这里,仅记录一下自己代码中断言的作用!
断言!再此程序断言:_xmppStream必须是nil,如果不是nil,程序强行中断!
要求调用方,必须自觉自律,要求是唯一的,你就应该是唯一的。
断言针对程序的核心代码区,有重要的保护作用
要求在开发过程中,就能够及时的发现错误,而不是去频繁的修改核心代码!
Copyright (C) , All Rights Reserved.
版权所有 闽ICP备号
processed in 0.039 (s). 10 q(s)ios拓展3-断言NSAssert()调试程序中的Bug - 简书
ios拓展3-断言NSAssert()调试程序中的Bug
NSAssert()是一个宏,用于开发阶段调试程序中的Bug.
#define NSAssert(condition, desc, ...)
condition是条件表达式,值为YES或NO;desc为异常描述,通常为NSString。
当conditon为YES时程序继续运行,为NO时,则抛出带有desc描述的异常信息。
NSAssert()可以出现在程序的任何一个位置。
具体事例如下:
- (void)viewDidLoad {
[super viewDidLoad];
[self assert:@"a"];
- (void)assert:(NSString *)str {
NSAssert(str, @"str is nil");
if (str) {
NSLog(@"%@",str);
NSLog(@"error");
[self assert:@"a"]; 调用
如果调用如下:
- (void)viewDidLoad {
[super viewDidLoad];
[self assert:nil];
程序会直接报错,
tips: 我更喜欢 断点po 或者 直接 NSLog,
看到抛出异常很难受
没有长篇大论,只有简单易懂
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金 相信有很多...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金相信有很多朋友...
Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调导致了样板模式, 使用Spring Cloud开发人员可以快速地支持实现这些模式的服务和应用程序。他们将在任何分布式...
2016年国庆假期终于把此书过完,整理笔记和体会于此。 关于书名 书名源于俄罗斯的演员斯坦尼斯拉夫斯基创作的《演员的自我修养》,作者为了写这本书前前后后修改了三十年之久,临终前才同意不在修改,拿去出版。使用这个书名一方面书单内容的确不是介绍一门新的编程语言或是展示一些实用的...
百战程序员_ Java1573题 QQ群:034603 掌握80%年薪20万掌握50%年薪10万 全程项目穿插, 从易到难,含17个项目视频和资料持续更新,请关注 国内最牛七星级团队马士兵、高淇等11位十年开发经验专...
日星期一升旗演讲: 文化传承,我们行在路上 我们的中国,是一个有着悠久历史的国度。在这五千年的历史长河中,我们能够看到:巍峨长城、皇家故宫的恢宏巨制,也能看到苏州园林、小桥流水的精致建筑。我们可以欣赏到唐代三彩、明朝青花瓷的绚烂色彩,也能看到五代秘色瓷、...
周南: (关雎) 关关雎鸠,在河之洲。窈窕淑女,君子好逑。 参差荇菜,左右流之。窈窕淑女,寤寐求之。 求之不得,寤寐思服。悠哉悠哉,辗转反侧。 参差荇菜,左右采之。窈窕淑女,琴瑟友之。 参差荇菜,左右芼之。窈窕淑女,钟鼓乐之。 诗经的第一首诗,我想大家都不陌生,特别是那一句...
不知道有没有那个哈韩的和我一样,对电视剧、电影、音乐的执着明显输于综艺,并不仅仅因为很多综艺节目都很搞笑,为而是他们都很治愈,因为搞笑艺人太苦了。在节目中,他们必须以一种兴奋的语调演绎剧本,脸上时刻挂满笑容,可是在演艺圈,搞笑人的境遇是很差的,没有娱乐公司的追捧,没有几...
不迟不早,一切都刚刚好。 印度有四句极具灵性的话: 无论你遇见谁,他都是对的人。 无论发生什么事,那都是唯一会发生的事。 不管事情开始于哪个时刻,都是对的时刻。 已经结束的,就已经结束了。 这几句话让我想起了佛陀释迦摩尼说过的相似的话: 无论你遇见谁,他都是你生命中该出现的...
一个跟脸斗了十来年的人,做了这么久的美白功课,没有白费, 其实美白很简单!别怪我没告诉你!!介绍一些跟美白有关的产品以下要说的都建立在已经做好每天好好洁面卸妆、保湿、防晒、定期去角质、尽量不吃感光食物、尽量不让肌肤直接暴露在阳光下的基础上。 美白是大多数女人都会遇到的问题,...一、Objective - C 中的断言:
Objective - C 中的断言处理使用的是 NSAssertionHandler :
每个线程拥有它自己的断言处理器,它是 NSAssertionHandler 类的实例对象。当被调用时,一个断言处理器打印一条包含方法和类名(或者函数名)的错误信息。然后它抛出一个 NSInternalInconsistencyException 异常。
基础类中定义了两套断言宏
NSAssert / NSCAssert
NSParameterAssert / NSCParameterAssert
/** NSParameterAssert */
#define NSParameterAssert(condition) NSAssert((condition), @"Invalid parameter not satisfying: %@", @#condition)
/** NSCParameterAssert */
#define NSCParameterAssert(condition) NSCAssert((condition), @"Invalid parameter not satisfying: %@", @#condition)
这么做的意义在于两点:
第一个是苹果对于断言处理在 API 层面进行了区分:
NSAssert&与&NSCAssert&用来处理一般情况的断言
NSParameterAssert&与&NSCParameterAssert&用来处理参数化的断言
第二个是区别是在 Objective - C 和 C 之间进行了区分这样才有了:
NSAssert&与&NSCAssert
NSParameterAssert&与&NSCParameterAssert
二、使用 NSAssertionHandler
从 Xcode 4.2 开始,发布构建默认关闭了断言,它是通过定义 NS_BLOCK_ASSERTIONS 宏实现的。也就是说,当编译发布版时,任何调用 NSAssert 等的地方都被有效的移除了。尽管基础类库的断言宏在它们自己的权力下十分有用&&&&虽然只用于开发之中。NSAssertionHandler 还提供了一套优雅地处理断言失败的方式来保留珍贵的现实世界的使用信息。
Pay Attension:
据说,许多经验丰富的 Objective-C 开发者们告诫不要在生产环境中使用 NSAssertionHandler。基础类库中的断言处理是用来在一定安全距离外来理解和感激的。请小心行事如果你决定在对外发布版的应用中使用它。
NSAssertionHandler&是一个很直接的类,带有两个需要在子类中实现的方法:-handleFailureInMethod:...&(当 NSAssert / NSParameterAssert 失败时调用)和&-handleFailureInFunction:...&(当 NSCAssert / NSCParameterAssert 失败时调用)。
接下来看一个使用的实例
#pragram 第一步,创建一个继承自NSAssertionHandler 的类:LoggingAssertionHandler 用来专门处理断言
#import &Foundation/Foundation.h&
@interface LoggingAssertionHandler : NSAssertionHandler
#import "LoggingAssertionHandler.h"
@implementation LoggingAssertionHandler
每个线程都可以指定断言处理器。&想设置一个 NSAssertionHandler 的子类来处理失败的断言,在线程的threadDictionary 对象中设置 NSAssertionHandlerKey 字段即可。
大部分情况下,你只需在
-application:didFinishLaunchingWithOptions:
中设置当前线程的断言处理器。
AppDelegate&中的处理
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
NSAssertionHandler *assertionHandler = [[LoggingAssertionHandler alloc] init];
[[[NSThread currentThread] threadDictionary] setValue:assertionHandler
forKey:NSAssertionHandlerKey];
这样我们就完成再当前线程中使用我们自定义的断言处理器的配置,那么接下来,如果有和我们条件不同的情况都直接会回调对应着的那两个失败的方法,我们可以在那俩个方法中按自己的输出意愿来处理你的话术。
#import "ViewController.h"
@interface ViewController ()
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSObject*mc = [NSObject new];
NSAssert(mc == nil, @"我不为空了");
根据输出情况可以看到是完全按照我们所需要的来输出的
2015-10-30 21:33:14.529 NSAssert[20537:678428] ***
Terminating app due to uncaught exception 'viewDidLoad', reason: '我不为空了'
三、使用上的注意点
仔细观察 NSAssert 的宏定义 ,你会发现 self 的痕迹,有 self 的地方就一定要注意 block 容易产生的循环引用问题。
接下来举个例子:
这样我们就会看到 Block 中循环引用的警告啦:
下午9.48.17.png
那如果我想在 Block 中使用断言怎么办呐?用&NSCAssert&替换&NSAssert,NSCParameterAssert&来替换&NSParameterAssert
- (void)viewDidLoad {
[super viewDidLoad];
NSObject*mc = [NSObject new];
self.aPerson = [person new];
self.aPerson.block = ^(int num){
NSCAssert(mc == nil, @"我不为空了");
NSCParameterAssert(num&5);
这样就 OK 了。
阅读(...) 评论()}

我要回帖

更多关于 ios 断言assert 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信