iOS 9新特性全了解

作者: rogertan30 | 来源:发表于2016-09-12 16:58 被阅读68次

新的属性关键字

  • nullable
    可能为空,属性修饰符
nullable 语法1
@property (nonatomic, strong, nullable) NSString *name;
 
  nullable 语法2 * 关键字 变量名
 @property (nonatomic, strong) NSString * _Nullable name;
 
 nullable 语法3
 @property (nonatomic, strong) NSString * __nullable name;
  • nonnull
    不能为空,属性修饰符

 nonnull 语法1
 @property (nonatomic, strong, nullable) NSString *name;
 
 nonnull 语法2 * 关键字 变量名
 @property (nonatomic, strong) NSString * _Nonnull name;
 
 nonnull 语法3
 @property (nonatomic, strong) NSString * __nonnull name;
  • null_resettable
    必须要处理为空情况,重写get方法,get方法不能返回nil,set可以传入为空
 @property (nonatomic, strong, null_resettable) NSString *name;
  • _Null_unspecified
    不确定是否为空

  • 宏定义
    NS_ASSUME_NONNULL_BEGIN & NS_ASSUME_NONNULL_END

修饰的范围,默认是nonnull

NS_ASSUME_NONNULL_BEGIN
@interface ViewController : UIViewController

@property (nonatomic, assign) int  name;

@end
NS_ASSUME_NONNULL_END

新的泛型

为什么要推出泛型?迎合swift

泛型作用:1.限制类型 2.提高代码规划,减少沟通成本,一看就知道集合中是什么东西
泛型定义用法:类型<限制类型>
泛型声明:在声明类的时候,在类的后面<泛型名称>
泛型仅仅是报警告
泛型好处:1.从数组中取出来,可以使用点语法
        2.给数组添加元素,有提示

泛型在开发中使用场景:1.用于限制集合类型

id是不能使用点语法

为什么集合可以使用泛型?使用泛型,必须要先声明泛型? => 如何声明泛型

自定义泛型?
什么时候使用泛型?在声明类的时候,不确定某些属性或者方法类型,在使用这个类的时候才确定,就可以采用泛型

自定义Person,会一些编程语言(iOS,Java),在声明Person,不确定这个人会什么,在使用Person才知道这个Person会什么语言
如果没有定义泛型.默认就是id

使用示范:

声明Person类

@interface Person<ObjectType> : NSObject

// 属性
@property (nonatomic, strong) ObjectType language;

@end

声明Language类

#import <Foundation/Foundation.h>

@interface Language : NSObject

@end

声明iOS类,其父类为Language

#import "Language.h"

@interface iOS : Language

@end

泛型的使用

#import "Person.h"
#import "Java.h"
#import "iOS.h"
@interface ViewController ()

@property (nonatomic, strong) NSMutableArray<NSString *> *arr;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    Java *java = [[Java alloc] init];
    iOS *ios = [[iOS alloc] init];
    
    // iOS
    Person<iOS *> *p = [[Person alloc] init];
    p.language = ios;
    
    // Java
    Person<Java *> *p1 = [[Person alloc] init];
    p1.language = java;
    
}

协变和逆变

__covariant:协变, 表示子类可转父类

__contravariant:逆变,表示父类可转子类

@interface Person<__contravariant ObjectType> : NSObject

// 语言
@property (nonatomic, strong) ObjectType language;

@end

__kindof

表示当前类或者它的子类


@interface Person : NSObject

// xcode5 才出 instancetype
// Xcode5之前使用 id
// instancetype:自动识别当前类的对象
//__kindof表示返回值是Person类或其子类
+ (__kindof Person *)person;

@end

相关文章

  • iOS 9新特性全了解

    新的属性关键字 nullable可能为空,属性修饰符 nonnull不能为空,属性修饰符 null_resetta...

  • iOS9、iOS10新特性

    iOS10新特性、iOS9新特性

  • Xcode8和iOS10问题小结

    目录 回顾iOS8-SDK新特性iOS9-SDK新特性iOS10-SDK新特性 Xcode8新字体 Xcode8插...

  • 2.1 布局之StackLayout(栈布局)

    1.介绍 1.1 基础 对于了解iOS9新特性的人来说,这个很好理解,相当于iOS里面的UIStackView,你...

  • IOS9 新特性对比

    IOS9 新特性 - (BOOL)application:(UIApplication *)application...

  • 转自(董铂然博客) iOS 9新特性及坑

    本文主要是说一些iOS9适配中出现的坑,如果只是要单纯的了解iOS9新特性可以看瞄神的开发者所需要知道的 iOS ...

  • iOS网络方面问题汇总

    1、使用HTTP请求 iOS9引入了新特性App Transport Security (ATS),新特性要求Ap...

  • ios上网的方法

    介绍 iOS9引入了新特性App Transport Security (ATS)。 新特性要求App内访问的网络...

  • iOS 9新特性

    以上属性错误写法 泛型 自定义泛型 以后可以这么试试 协变性与逆变性 __ kindof使用 控制状态栏, 经过测...

  • iOS 9 新特性

    iOS 9 新特性关键字:nonnull,nullable,null_resettable nonnull:表示不...

网友评论

    本文标题:iOS 9新特性全了解

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