ios9 的新特性

1、关键字

(好处:1、提高开发规范    2、在方法中才发挥一些作用

1》在属性中使用关键字:

1)nullable:可能为空。(在对象之前写一个这个标注,主要是了为了迎合swift语言)

           注意:只能使用对象类型,不能用于基本类型

           swift中都需要约束是否为空。

           swift是一个强语言,在编译的时候就会报错,弱语言就不会。

      书写方式一:(放在属性里面)

       书写方式二:

        书写方式三:(只有在测试版本的时候才这样敲)

2)nonnull:非空 (get,set非空)

         书写方式一:

计算机生成了可选文字:
NSString * _Nonnull name 
lonContr011er * _Nultab1e 
naviqationController 
qavigationltem * _Nonnull 
ndvx 
load.

         书写方式二:

         书写方式三:

         如果进入头文件,会发现很少用到nonnull这个关键字,但是在敲方法的时候,又会出现nonnull,

          苹果是这样做得:

用一个宏:

在这个宏之间的,都是默认是nonnull。

3)null_resettable get方法中,为非空。在set方法中,可以为空

           注意点:必须处理为nil的情况

        书写方式一:

       get方法中,为非空。在set方法中,可以为空

计算机生成了可选文字:
im lementation ViewCont roller 
NSString * _Nonnu11 name 
Incontrouer * _Nullable 
vigationController 
Ivigationltem * _Nonnull 
ationltem 
sel name 
SB , *pnonnull—

      用处:  有的时候,允许传得时候为空,但是返回值的时候必须有值!!!

4_Null_unspecified:不确定

             在用点语法的时候(会出现这个)

2》在方法中使用关键字:(两个都可以)

1)使用方法:

计算机生成了可选文字:
// — (nonnull NSString 
return nil; 
— ( NSString * _NonnuII)test 
return nil;

2ios9新特性之泛型

     1 作用:限制类型

      2)使用场景:1、用于集合、数组、字典、NSSet

                                        2、当声明一个类的时候,某个属性不确定类型,就可以使用泛型

      3)泛型的好处:提高开发的规范,一看便知道集合中是啥东东

计算机生成了可选文字:
//— (void )observeValueF 
change: (N ictiona 
•ng ofObject: (id)object 
SString * , id:» ) change context: (void * ) context 
//— (void) touchesBegan: (NSSet UI Touch * touches withEvent: (UIEvent

      4)如何定义泛型:在类型后面限制,<限制类型>

如果没有用泛型去定义的话,在下面方法调用中没有提示:

计算机生成了可选文字:
(void)viewDidLoad 
(super viewDidLoad) ; 
// Do any additional setup after Loading the view, t) 
self. datas 
ad 
b ect (nonnull id) 
M void addObject (nonnutt 
addObjects rom r ray: nonnull NSArray * ) 
void

定义泛型之后:

计算机生成了可选文字:
// Do any additional 
self. d 
NSMutableArrycNSString * datas

计算机生成了可选文字:
self. datas 
M void 
b' ect: (nonnull NSStrin * ) 
add 
add0bject: (nonnutt NSSt' ing

而且还有一个好处:取东西的时候方便,可以用点语法,因为知道你取的东西不是id类型了。

(id类型不能用点语法)

如果不定义泛型,是这样取数据:

如果定义了泛型,这样取数据

              self.datas[0].length;

注意:1、并不是任何对象都能使用泛型

              2、泛型只用于方法调用

              3、在不可变数组中,是没有意义的。

自定义泛型:

如果没有定义泛型,拿到属性的时候,只能用父类。

计算机生成了可选文字:
(self. datas 
50 // 
Person *person 
erson. la 
Language * language 
length); 
Person al loc) init);

我们的要求是以创建的时候,就知道有

计算机生成了可选文字:
glass 
@interface PersoneObjectTyp» : NSObject 
@property (nonatomic, strong) language; 
@end

在用的时候再去定义,

计算机生成了可选文字:
java *java 
Java al loc) init); 
ttiOS al loc) init l; 
iOS *ios 
// os 
person alloc) init); 
person«iOS *person 
person. language 
ios; 
Java 
erson« ava *personl 
e jpvd; 
t (Person al loc J init);

5)泛型关键字:(协变、逆变)

1》协变:(向上转,子类转父类)

计算机生成了可选文字:
Person«Language *p; 
iOS *ios I liOS aUocl init I ; 
Person«iOS I (person al loc) init) ; 
pl. language 
ios; 
Incompatible poinW types assigning to •

这个时候,需要加一个强转:

计算机生成了可选文字:
ante r face perkn 
bjectTyp» : NSObject 
covar an 
eproperty (nonatomic, strong) ObjectType language; 
@end

 

2》逆变:(向下转,父类转子类)

计算机生成了可选文字:
@interface Person 
con avariant ObjectType*• : NSObject 
ep roperty (nonatomic, strong) ObjectType language; 
@end

计算机生成了可选文字:
Person«iOS — 
pl. language 
ios; 
cova r iant : , 
_cont ravariant : 
C (Person al loc) ;

      

3、ios9新特性之 __kinof (UItableView)

       __kindof:相当于,修饰对象,用于返回值,描述返回的类型是当前类或者子类。

从xcode5开始的时候,由原先的id变为instance。

用id的坏处:

1、id不能使用点语法。

2、能调用任何对象的方法,导致不能进行编译检查

所以在xcode5开始就会instance,因为instance会自动检测当前类的对象。

但是不管用id还是instance,都不知道返回类型,所以又有了新的改进。

当然如果你原先不传id,就直接传你想传得类型(person *),可是在创建子类的时候,会报错。

Xcode7就出了一个新的特性:

计算机生成了可选文字:
+ (_kihdof Person

计算机生成了可选文字:
(Person 
SubPerson 
personl 
tsubperson 
* erson 
rson 
MJ _ kindof Person * person

像在tableviewcell中,也有这样的情况,因为我们喜欢自定义cell,加了这个,就会返回我们想要的类型。

原文地址:https://www.cnblogs.com/base0225/p/5032479.html