一:如何去学习?都去学习什么?

1:学习优秀项目的设计思想,多问几个为什么,为什么要这么设计,这么设计的好处是什么,还能不能在优化 ,如何应用到自己的项目中 2:学习优秀项目的代码风格,代码的封装设计思想,为什么要这么设计,这么设计的好处是什么,还能不能在优化 ,如何应用到自己的项目中,每行代码都要用心去写,每一行代码都要力求使最简洁的

3:学习别人遇到问题是如何分析问题,解决问题的方法是什么

4:遇到新东西应该如何去学习:1:先研究要学习的东西作用是什么 ,有什么好处  2:如何使用:具体的语法知识 ,参照苹果的API 3:使用场景:一般在项目中有什么应用。

5:最重要的就是花大量的时间研究优秀的代码,比别人想的深比别人想的远,注意每一个细节,把每一个细节都要搞懂,把每一个细节做到极致,花大量的时间去实践练习,将学习到的知识应用于项目中。

二:nullable, nonnull,null_resettable,_Null_unspecified 的关键字的认识

/* 1:介绍怎么去研究新特性? 1.使用新的xcode创建项目,用旧的xcode去打开Xcode7 2015 iOS9Xcode6 2014 iOS8Xcode5 2013 iOS7Xcode4 2012 iOS61.出了哪些新特性 iOS9:关键字:可以用于属性,方法返回值和参数中关键字作用:提示作用,告诉开发者属性信息关键字目的:迎合swift,swift是个强语言,swift必须要指定一个对象是否为空关键字好处:提高代码规划,减少沟通成本关键字仅仅是提供警告,并不会报编译错误*//* 2:nullable:nullable:1.怎么使用(语法) 2.什么时候使用(作用)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;*//* 3:nonnullnonnull:1.怎么使用(语法) 2.什么时候使用(作用)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;*//*4:null_resettable:null_resettable:1.怎么使用(语法) 2.什么时候使用(作用)null_resettable:必须要处理为nil情况,重写get方法null_resettable作用:get方法不能返回nil,set可以传入为空null_resettable 语法1@property (nonatomic, strong, null_resettable) NSString *name;- (NSString *)name{if (_name == nil) {_name = @"";}return _name;}*//*5:_Null_unspecified:不确定是否为空*//*6:1:关键字注意点在NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END之间默认是nonnull,一般前者写在头文件之下,后者写在end之上2:关键字不能用于基本数据类型(int,float),nil只用于对象3: @property (nonatomic) NSString *name;如此写法,默认为strong修饰的*/#import "ViewController.h"@interface ViewController ()// nonnull
// 没有处理为空的情况
@property (nonatomic, strong, nonnull)NSString  *name;@end@implementation ViewController//- (UIView *)view
//{
//    if (_view == nil) {
//        [self loadView];
//        [self viewDidLoad];
//    }
//    return _view
//}- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.

}@end

三:泛型

#import "ViewController.h"/*1:泛型介绍泛型:限制类型 为什么要推出泛型?迎合swift泛型作用:1.限制类型 2.提高代码规划,减少沟通成本,一看就知道集合中是什么东西泛型定义用法:类型<限制类型>:NSMutableArray<NSString *> *arr,数组里存放的都是字符串类型2:类的泛型声明:泛型声明:在声明类的时候,在类的后面<泛型名称>:@interface Person<ObjectType> : NSObject泛型仅仅是报警告泛型好处:1.从数组中取出来,可以使用点语法:数组中存放元素的类型为id类型, id是不能使用点语法,但是利用泛型,给其限制类型,则从数组中取出对象后,可以利用点语法2.给数组添加元素,有提示3: 泛型在开发中使用场景:1.用于限制集合类型:(集合类包括NSArray和NSSet,两者用法相同,前者是有序的,而后者却是无序的)为什么集合可以使用泛型?使用泛型,必须要先声明泛型? => 如何声明泛型自定义泛型?什么时候使用泛型?2: 在声明类的时候,不确定某些属性或者方法类型,在使用这个类的时候才确定,就可以采用泛型自定义Person,会一些编程语言(iOS,Java),在声明Person,不确定这个人会什么,在使用Person才知道这个Person会什么语言如果没有定义泛型.默认就是id例如:1;声明泛型#import <Foundation/Foundation.h>@interface Person<ObjectType> : NSObject// 语言@property (nonatomic, strong) ObjectType language;@end2:使用:Java *java = [[Java alloc] init];iOS *ios = [[iOS alloc] init];// iOSPerson<iOS *> *p = [[Person alloc] init];p.language = ios;// JavaPerson<Java *> *p1 = [[Person alloc] init];p1.language = java;*/#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];// iOSPerson<iOS *> *p = [[Person alloc] init];p.language = ios;// JavaPerson<Java *> *p1 = [[Person alloc] init];p1.language = java;
}- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{}@end

四:泛型的协变和逆变

#import "ViewController.h"/*  1:泛型:限制类型 为什么要推出泛型?迎合swift泛型作用:1.限制类型 2.提高代码规划,减少沟通成本,一看就知道集合中是什么东西泛型定义用法:类型<限制类型>泛型声明:在声明类的时候,在类的后面<泛型名称>泛型仅仅是报警告泛型好处:1.从数组中取出来,可以使用点语法2.给数组添加元素,有提示泛型在开发中使用场景:1.用于限制集合类型id是不能使用点语法为什么集合可以使用泛型?使用泛型,必须要先声明泛型? => 如何声明泛型自定义泛型?什么时候使用泛型?在声明类的时候,不确定某些属性或者方法类型,在使用这个类的时候才确定,就可以采用泛型自定义Person,会一些编程语言(iOS,Java),在声明Person,不确定这个人会什么,在使用Person才知道这个Person会什么语言如果没有定义泛型.默认就是id用于父子类型转换泛型:__covariant:协变, 子类转父类 :也就是将子类的指针赋值给子类__contravariant:逆变 父类转子类:也就是将父类的指针赋值给子类泛型注意点:在数组中,一般用可变数组添加方法,泛型才会生效,如果使用不可变数组,添加元素,泛型没有效果,只是提示的作用2:继承:子类继承父类后,父类可在.h中暴露方法例如初始化方法供子类去继承 1:父类只暴露了初始化方法没有重写,子类继承后,子类可以重写,(子类在重写时,尽量用self,不要用类名,避免其他类在继承该类的时候,初始化得到的都是该类的对象,而不是继承的子类的对象。)那么子类重写后,在父类中的self就为子类的对象,其中多个子类继承同一个父类的时候,父类可以提供一个get的标识方法供子类重写返回标识,从而在父类中来区分不同的子类 2:父类提供方法,供子类继承,父类在实现该方法,则子类在外部调用初始化方法的时候,就会调用父类中实现的初始化方法。(新浪参数模型抽父类继承的例子),若是子类又重写父类的初始化方法,调用super会执行父类的方法,否则就不会执行父类的方法,会覆盖掉父类的方法,只保留子类的方法*/#import "Person.h"
#import "Java.h"
#import "iOS.h"
@interface ViewController ()@property (nonatomic, strong) NSMutableArray<NSString *> *arr;@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];[_arr addObject:@"123"];
//    _arr = @[@"213",@"213",@1];// Do any additional setup after loading the view, typically from a nib.
    iOS *ios = [[iOS alloc] init];Language *language = [[Language alloc] init];// 父类转子类Person<Language *> *p = [[Person alloc] init];p.language = language;// iOSPerson<iOS *> *p1 = [[Person alloc] init];p1 = p;}
// 子类转父类
- (void)covariant
{iOS *ios = [[iOS alloc] init];Language *language = [[Language alloc] init];// iOSPerson<iOS *> *p = [[Person alloc] init];p.language = ios;// LanguagePerson<Language *> *p1;p1 = p;}- (void)test
{Java *java = [[Java alloc] init];iOS *ios = [[iOS alloc] init];// iOSPerson<iOS *> *p = [[Person alloc] init];p.language = ios;// JavaPerson<Java *> *p1 = [[Person alloc] init];p1.language = java;}@end

五:__kindof

#import "ViewController.h"
#import "SubPerson.h"/*kindof:相当于__kindof:表示当前类或者它的子类',类设计历史id:可以调用任何对象方法,可以作为参数或是返回值,不能进行编译检查instancetype:自动识别当前类的对象,只能作为返回值不能作为参数,自动返回与当前类类型相同的对象*/@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];/***    当父类提供初始化的方法的时候,子类继承了父类的方法,若是子类SubPerson调用父类的初始化方法:person,则返回的是父类对象的类型,会出现警告,这时,可以在父类中定义的初始化方法用__kindof来修饰,表示当前类或是其子类。+ (__kindof Person *)person;*/SubPerson *p = [SubPerson person];}@end

转载于:https://www.cnblogs.com/cqb-learner/p/5868702.html

ios开发ios9新特性关键字学习:泛型,逆变,协变,__kindof相关推荐

  1. iOS开发-iOS10新特性及开发者主要注意点

    看了WWDC2016直播,我们发现变得谨慎而开放的苹果在新一版四大平台系统中展示了很多变化,当然重中之重还是伟大的iOS.通过试用iOS10beta版,除了长大了的更强大的Siri主要感受到iMess ...

  2. iOS之iOS9新特性——__kindof

    __kindof:表示当前类或者它子类__kindof书写格式: 放在类型前面,表示修饰这个类型(__kindof Person *)__kindof :在调用的时候,很清楚的知道返回类型id坏处: ...

  3. fir.im Weekly - 从 iOS 10 SDK 新特性说起

    2019独角兽企业重金招聘Python工程师标准>>> 从 iOS 7 翻天覆地的全新设计,iOS 8 中 Size Classes 的出现,应用扩展,以及 Cloud Kit 的加 ...

  4. 【ios开发/Xcode】实现关键字检索

    [ios开发/Xcode]实现关键字检索 实现效果 源代码 实现效果 源代码 注:@开头的这些代码都是需要关联控键,都需要自行在故事板中(Storyboards)进行关联 import UIKitcl ...

  5. HTML5新特性的学习笔记

    HTML5新特性的学习笔记 HTML 超文本标记语言: HyperText Markup Language 这份学习笔记的主要内容是HTML5的新标签 基于菜鸟教程的个人向学习笔记 菜鸟教程 文章目录 ...

  6. ES6新特性的学习和使用

    ES6新特性的学习和使用 本文是基于Windows 10系统环境,进行ES6新特性的学习和使用 Windows 10 React 一.ES6的新语法 (1) let和const ES6之后尽量少使用v ...

  7. 开发者所需要知道的 iOS 9 SDK 新特性

    本文为InfoQ中文站特供稿件,首发地址.如需转载,请与InfoQ中文站联系. 年年岁岁花相似,岁岁年年人不同.今年的 WWDC 一如既往的热闹,但是因为要照顾家里刚出生的宝宝以及宝宝的娘,就只能在家 ...

  8. 开发者需要知道的iOS 9 SDK新特性

    2019独角兽企业重金招聘Python工程师标准>>> 一.iPad多任务功能增强 1.全新的多任务界面 在iOS 9中,多任务界面从原来的横向单层排列进化成层叠排列,从而减少滚屏手 ...

  9. iOS开发-由浅至深学习block

    作者:Sindri的小巢(简书) 关于block 在iOS 4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调.这不免让我们想到在C函数中,我们 ...

最新文章

  1. 用CSS实现梯形图标
  2. windows下使用Python来修改文件时间戳
  3. windows服务与网页交互_戴尔高级主动式触控笔-PN579X评测:Windows也有好触控
  4. 谈谈技术原则,技术学习方法,代码阅读及其它
  5. 用python设计学生管理系统_Python实现GUI学生信息管理系统
  6. (八)企业部分之nginx+tomcat+memcached负载均衡集群搭建
  7. 产生死锁的四个必要条件
  8. ruby 执行函数_Ruby at()函数
  9. 使用Huploadify上传文件并动态传递参数到后台
  10. Nerv --- React IE8 兼容方案
  11. OpenCV Mat主要用法(2)_MatExpr
  12. 版本控制软件Visual Source safe使用小结 (配合上文)
  13. 超级好用的坐标转换软件
  14. Oracle 提取汉子去除非汉子数据(保留标点符号)
  15. LINUX下载编译FreeSwitch
  16. G502使用计算机配置,罗技G502鼠标驱动调试详解!实战《男友4》设置!
  17. Debian回收站无法删除解决
  18. Ubuntu20.04 添加打印机
  19. Vue源码学习 -- 响应式原理之观察者模式
  20. 员工转正申请书_员工转正申请书

热门文章

  1. SQL Server 存储引擎-剖析Forwarded Records
  2. gluPickMatrix和glReadPixels
  3. .net数据绑定控件中的数据导出到Excel
  4. 微软中国职位[北京工作]
  5. Chrome英文版离线安装包下载
  6. 【Pascal's Triangle II 】cpp
  7. init/inittab
  8. UML类图解义 (来自《大话设计模式》)
  9. C++ 重载(overload)、重写(overrride)、重定义(redefine)总结
  10. 一键了结CUP100%问题