Object-C中nil、Nil、NULL与NSNull的一些理解

定义区别
  • nil
    指向OC中对象的空指针;

  • Nil
    指向OC中类的空指针;

  • NULL
    指向变量类型的空指针;

  • NSNull
    在集合对象中,表示空值的对象;

使用小结

从字面意义上理解,nil是一个对象,而NULL是一个值,所以在调用对象方法时:[nil 任意方法] 返回NO,不会出现问题,这与Java等语言中经典的NullPointerException空值异常大相径庭;[NSNull 任意方法] 抛出异常甚至导致崩溃。

常见用法:

NSURL *url = nil;
Class class = Nil;int *pointerInt = NULL;
  1. NSNULL,NULL和nil在本质上应该是一样的,NULL和nil其实就是0,但是在Objective-c中,对于像NSArray这样的 类型,nil或NULL不能做为加到其中的Object,如果定义了一个NSArray,为其分配了内存,又想设置其中的内容为空,则可以用 [NSNULL null返回的对对象来初始化NSArray中的内容。因为在集合对象如NSArray和NSDictionary中nil中有特殊的含义(表示列表结 束),所以不能在集合中放入nil值。如要确实需要存储一个表示“什么都没有”的值,可以使用NSNull类,能起到占位符的作用。NSNull只有一个 方法:

    + (NSNull *) null;
常见案例
  1. 下面一段代码是常见的错误,release对象没有设置为nil,从而引起程序崩溃:

    id someObject=[[Object alloc] init]; //...[someObject release]; //...if(someObject){ 
     //crash here}
  2. 常见判空处理:

    //判断对象不空if(object) {}//判断对象为空if(object == nil) {}//数组初始化,空值结束NSArray *pageNames=[[NSArray alloc] initWithObjects:@"DocumentList",@"AdvancedSearch",@"Statistics",nil];//判断数组元素是否为空UIViewController *controller=[NSArray objectAtIndex:i];if((NSNull *)controller == [NSNull null]){ 
         //}//判断字典对象的元素是否为空NSString *userId=[NSDictionary objectForKey:@"UserId"];if(userId == [NSNull null]){ 
         //}

最后通过集合对象中占位符来加深一下理解:

NSObject *obj1 = [[NSObject alloc] init];NSObject *obj2 = [NSNull null];NSObject *obj3 = [NSObject
 **new
**];NSObject *obj4;NSArray *arr1 = [NSArray arrayWithObjects:obj1, obj2, obj3, obj4, nil];NSLog(@"arr1 count: %ld", [arr1 count]); //count: 3 因为obj=nil,在加入obj4时就结束添加对象NSObject *obj1;NSObject *obj2 = [[NSObject alloc] init];NSObject *obj3 = [NSNull null];NSObject *obj4 = [NSObject
 **new
**];NSArray *arr2 = [NSArray arrayWithObjects:obj1, obj2, obj3, obj4, nil];NSLog(@"arr2 count: %ld", [arr2 count]); //count: 0,因为obj1=nil,所以后面的对象没有添加进去[NSNull null]通常作为占位符作用,如下:NSObject *obj1 = [NSNull null];NSArray *arr1 = [NSArray arrayWithObjects:@"One", @"TWO", obj1,@"three",nil];

**for** (NSString *str in arr1) {NSLog(@"array object: %@", str);

} //result:One、Two、、threeNSObject *obj1 = [NSNull null];NSArray *arr1 = [NSArray arrayWithObjects:@"One", @"TWO", obj1,@"three",nil];

**for** (NSString *str in arr1) {

**if** (str != [NSNull null]){NSLog(@"array object: %@", str);

}

}//result:One、Two、three


转载于:https://my.oschina.net/kmodel/blog/619297

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Objective-C ,可以使用 AVFoundation 框架来实现扫描二维码并跳转到图片。以下是一个简单的示例代码: ```objective-c // 导入 AVFoundation 框架 #import <AVFoundation/AVFoundation.h> // 创建扫描器 AVCaptureSession *session = [[AVCaptureSession alloc] init]; // 创建视频输入设备 AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil]; if (input) { [session addInput:input]; } else { NSLog(@"无法创建视频输入设备"); } // 创建元数据输出对象 AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init]; [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; [session addOutput:output]; // 设置二维码类型 output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode]; // 创建预览层 AVCaptureVideoPreviewLayer *previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:session]; previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; previewLayer.frame = self.view.bounds; [self.view.layer addSublayer:previewLayer]; // 启动扫描器 [session startRunning]; ``` 上述代码会创建一个扫描器,并在界面上显示一个预览层。当扫描到二维码时,会触发以下代理方法: ```objective-c - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection { // 遍历扫描到的元数据对象 for (AVMetadataMachineReadableCodeObject *metadata in metadataObjects) { // 判断是否为二维码 if ([metadata.type isEqualToString:AVMetadataObjectTypeQRCode]) { // 获取二维码内容 NSString *stringValue = metadata.stringValue; // 跳转到图片 UIImage *image = [UIImage imageNamed:stringValue]; if (image) { UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; imageView.contentMode = UIViewContentModeScaleAspectFit; imageView.frame = self.view.bounds; [self.view addSubview:imageView]; } // 停止扫描 [session stopRunning]; } } } ``` 在上述代理方法,当扫描到二维码时,会获取二维码内容,并根据内容加载一张图片,并添加到界面上。同时,停止扫描器的运行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值