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

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

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

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

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

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

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

/* 1:介绍
    怎么去研究新特性? 1.使用新的xcode创建项目,用旧的xcode去打开
    Xcode7 2015 iOS9
    Xcode6 2014 iOS8
    Xcode5 2013 iOS7
    Xcode4 2012 iOS6

    1.出了哪些新特性 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:nonnull
 nonnull: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;

    @end

 2:使用:

 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;

 */

#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;
}

- (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;

    // iOS
    Person<iOS *> *p1 = [[Person alloc] init];
    p1 = p;

}
// 子类转父类
- (void)covariant
{
    iOS *ios = [[iOS alloc] init];
    Language *language = [[Language alloc] init];
    // iOS
    Person<iOS *> *p = [[Person alloc] init];
    p.language = ios;

    // Language
    Person<Language *> *p1;
    p1 = p;

}

- (void)test
{
    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;

}

@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
时间: 2024-12-17 05:03:54

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

iOS开发-项目新特性

iOS开发实用技巧—项目新特性页面的处理 iOS开发实用技巧篇—项目新特性页面的处理 说明:本文主要说明在项目开发中会涉及到的最最简单的新特性界面(实用UIScrollView展示多张图片的轮播)的处理. 代码示例: 新建一个专门的处理新特性界面的控制器,可以实用代码也可以用xib,在这里实用纯代码方式,创建一个控制器NewfeatureViewController. 头文件代码: 1 // 2 // JMNewfeatureViewController.h 3 // 4 5 #import <

iOS9新特性之常见关键字

iOS9新特性关键字:可以用于属性.方法返回值和参数中 关键字的作用:提示作用,告诉开发者属性信息 关键字的目的:迎合swift,swift是个强语言,swift必须要指定一个对象是否为空 关键字的好处:提高代码规划,减少沟通成本 关键字使用错误仅仅报一个警告,并不会编译错误 nullable:1.怎么使用(语法)2.什么时候使用(作用) nullable的作用:可能为空 nullable 语法1 @property (nonatomic, strong nullable) NSString *

iOS9新特性

01-iOS9新特性之常见关键字 如何学习新技术 1.发现:有时候工作无缘无故,会发现新的东西,先保存起来 2.研究东西:1.研究作用 2.研究书写格式 3.测试: 4.注意点: 如何去研究新的API 1.百度: iOS9API 2.WWDC 和 查看苹果官方文档 (英文基础) 3.用最新版本的xcode7创建一个项目,用老版本Xcode6打开 关键字 苹果为什么要推出关键字?     1.迎合swift,swift强语言,OC弱语言 swift必须描述属性有没有值 关键字注意点: 1.只对方法

WWDC总结:开发者需要知道的iOS 9 SDK新特性

http://blog.csdn.net/uxyheaven/article/details/46470801 编者按:WWDC 2015苹果开发者大会是移动开发者一年一度的盛会,InfoQ中文站除了第一时间整理Keynote内容分享给大家之外,还邀请了资深的一线开发者分享他们的收获.本文为王巍(@onevcat)对WWDC上透露的iOS 9 SDK新特性的总结,分享给广大的iOS开发者. 年年岁岁花相似,岁岁年年人不同.今年的 WWDC 一如既往的热闹,得益于 Apple 的随机抽选机制,这两

iOS9新特性——堆叠视图UIStackView

iOS9新特性--堆叠视图UIStackView 一.引言 随着autolayout的推广开来,更多的app开始使用自动布局的方式来构建自己的UI系统,autolayout配合storyBoard和一些第三方的框架,对于创建约束来说,已经十分方便,但是对于一些动态的线性布局的视图,我们需要手动添加的约束不仅非常多,而且如果我们需要插入或者移除其中的一些UI元素的时候,我们又要做大量的修改约束的工作,UIStackView正好可以解决这样的问题. 二.在storyBoard上初识StackView

了解iOS各个版本新特性总结

参考了一下的文章:https://blog.csdn.net/zxtc19920/article/details/54341836 iOS7新特性 · 在iOS7当中,使用麦克风也需要取得用户同意了.如果用户不允许app使用麦克风的话,那么需要使用麦克风的app就不能接收不到任何声音 · [NSArray firstObject]的实现,iOS4之前只是一个私有的方法 · UIImage.renderingMode着色(Tint Color),可以设置一个UIImage在渲染时是否使用当前视图的

Atitit.业务系统的新特性&#160;开发平台&#160;新特性的来源总结

Atitit.业务系统的新特性 开发平台 新特性的来源总结 1.1. 语言新特性(java c# php js python lisp c++ oc swift ruby  go dart1 1.2. 流行lib.frmawork  新特性 jdk clr framework 新特性 (jq   Servlet2 1.3. Ide 新特性( eclipse vs netbea jetbrain2 1.4. Vm  新特性 clr  jvm(jvm好像没有独立的版本号,继承在jdk里面2 1.5.

iOS9新特性及适配教程

iOS9网络适配_ATS:改用更安全的HTTPS(见Demo1)iOS9新特性_更灵活的后台定位(见Demo2)(网址:https://github.com/ChenYilong/iOS9AdaptationTips) WHAT(什么是SSL/TLS?跟HTTP和HTTPS有什么关系) WHY(以前的HTTP不是也能用吗?为什么要用SSL/TLS?Apple是不是又在反人类?) HOW(如何适配?---弱弱地问下:加班要多久?) 第1种情况:HTTPS Only (只有HTTPS,所有情况下都使

Xcode And iOS9新特性

Xcode And iOS9 1. Xcode7 新特性 > 可直接在真机上运行自己的应用,只需要有苹果账号,无需购买苹果开发者账号. > 可设置在出现 EXC_BAD_ACCESS 错误时,显示更详细的错误信息. 设置方式:XCode->Product->Scheme->Edit Scheme 左侧选择“Run” 右侧选择“Diagnostics(诊断)” 在“Runtime Sanitization(运行时净化处理)” 勾选“Enable Address Sanitize