iOS9新特性

iOS9新增的一些新特性

1.關(guān)鍵字

iOS9新出的關(guān)鍵字:用來修飾屬性,或者方法的參數(shù),方法的返回值
好處
1.迎合swift
2.提高開發(fā)人員的開發(fā)規(guī)范须妻,減少程序員之間的交流
iOS9新出的關(guān)鍵字nonnull,nullable只能修飾對象菇篡,不能修飾基本數(shù)據(jù)類型
nullable:表示可以為空

//nullable:表示可以為空
//兩種常用方式
@property(nonatomic,strong,nullable)NSString *nameStr1;
@property(nonatomic,strong)NSString *_Nullable nameStr2;

//nonnull: non:非 null:空
@property(nonatomic,strong,nonnull)NSString *icon1;
@property(nonatomic,strong)NSString *_Nonnull icon2;

//方法中關(guān)鍵字的書寫規(guī)范
-(nonnull NSString *)test1:(nonnull NSString *)str1;
-(NSString *_Nonnull)test2:(NSString *_Nonnull)str2;

對于上面的nonnull,新的Xcode里面的UIKit框架多了NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END兩個字段波闹,這兩句話的意思和nonnull一樣

在NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END之間酝豪,定義的所有屬性和方法默認都是nonnull,可以發(fā)現(xiàn)蘋果的對象都是這樣修飾的
 
NS_ASSUME_NONNULL_BEGIN
@property(nonatomic)NSString *nStr;
NS_ASSUME_NONNULL_END

除了上面的幾個修飾符精堕,有的對象還有null_resettable這個修飾符

/*
 null_resettable: get方法不能返回為空孵淘, set方法可以為空
 注意:如果使用null_resettable,必須重寫get方法
 */
@property(nonatomic,strong,null_resettable) NSString *testStr;

重寫get方法
//法一
-(NSString *)testStr{
    if (_testStr ==nil) {
        _testStr = @"重寫get方法 法1";
    }
    return _testStr;
}
//法2
-(void)setTestStr:(NSString *)testStr
{
    if (testStr == nil) {
        testStr = @"重寫get方法 法2";
    }
    _testStr = testStr;
}


_Null_unspecified:不確定是否為空
還有一個_Null_unspecified的修飾符歹篓,會在self.testStr的時候出現(xiàn)瘫证。用self.testStr的時候不確定是取值還是賦值,不確定是set還是get  沒什么意義
@property(nonatomic,strong) NSString *_Null_unspecified testStr1;

2.泛型

泛型: 限制類型
泛型使用場景
1.在集合(數(shù)組庄撮,字典背捌,NSSet)中使用泛型比較常見
2.當(dāng)聲明一個類,類里面的某些屬性類型不確定洞斯,這時我們才使用泛型

泛型書寫規(guī)范
在類型后面定義泛型毡庆,NSMutableArray<NSString *> *dataArr;

泛型修飾
只能修飾方法的調(diào)用

泛型好處
1.提高開發(fā)規(guī)范,減少程序員之間的交流
2.通過集合取出來的對象烙如,直接當(dāng)泛型對象使用么抗,可以直接使用.點語法

基本的使用  下面的例子表明這個數(shù)組是字符串類型
@property(strong,nonatomic)NSMutableArray<NSString*> *dataArr;
拓展
定義三個對象Person、Java亚铁、IOS
其中Java和IOS繼承自Language
Language和Persion都繼承自NSObject


#import <Foundation/Foundation.h>
#import "Language.h"
#import "IOS.h"
#import "Java.h"
//模仿NSMutableArray系統(tǒng)自帶
@interface Person<ObjectType> : NSObject
//語言
//@property(nonatomic) id language;
//@property(nonatomic) IOS *language;
@property(nonatomic) ObjectType language;
/*
 id: 任何對象都能傳進來
 Language: 在外面調(diào)用的時候蝇刀,沒有提示
 IOS:外面調(diào)用只能傳對象
 */
 
 
//如果沒有<IOS *> 泛型就確定,就是id類型
Person<IOS *> *p  = [[Person alloc] init];
p.language = [IOS new];
@end

泛型 協(xié)變和異變

協(xié)變

__covariant(協(xié)變):用于數(shù)據(jù)強制類型徘溢,可以向上強轉(zhuǎn)吞琐,子類可以轉(zhuǎn)成父類(NSArray點進去可以看到修飾符和NSMutableArray不一樣)

只需要在Persion中的ObjectType前面加上__covariant
@interface Person<__covariant ObjectType> : NSObject

然后在ViewController中調(diào)用的時候就可以使用了
Person<Language *> *p = [Person new];
    
Person<IOS *> *iosP  = [[Person alloc] init];
iosP.language = [IOS new];

//如果子類想給父類賦值,協(xié)變
p = iosP;
逆變

__contravariant(逆變):用于泛型類型數(shù)據(jù)強制類型,可以向下強轉(zhuǎn)然爆,父類可以轉(zhuǎn)成子類

和協(xié)變類似站粟,Persion后的修飾詞改成__contravariant就是逆變
@interface Person<__contravariant ObjectType> : NSObject

Person<Language *> *p = [Person new];
Person<IOS *> *iosP  = [[Person alloc] init];
iosP.language = [IOS new];
//逆變
iosP = p;

3.__kindof

點開UITableView里面,發(fā)現(xiàn)里面有__kindof的關(guān)鍵字

__kindof:表示當(dāng)前類或者它子類
__kindof書寫格式:
放在類型前面施蜜,表示修飾這個類型
__kindof:在調(diào)用的時候卒蘸,很清楚的知道返回的類型


同樣創(chuàng)建一個繼承自NSObject的Person類,Son類繼承自這個類
在Person類中寫方法

法1
.h
+(id)person;
.m
+(id)person{
    return [[self alloc] init];
}

法2
僅僅表示Person類
.h
+(Person *)person;
.m
+(Person *)person{
    return [[self alloc] init];
}

法3
會自動識別當(dāng)前類的調(diào)用
.h
+(instancetype)person;
.m
+(instancetype)person{
    return [[self alloc] init];
}

法4
__kindof Person * 表示可以是Person類或者他的子類
.h
+(__kindof Person *)person;
.m
+(Person *)person{
    return [[self alloc] init];
}

在ViewController中調(diào)用的時候,可以清晰的看出來[Son person]定義的對象的類型缸沃,可以是Person恰起,也可以是Son類型的
Son *s = [Son person];
id的壞處:1.不能在編譯的時候檢測真是類型  不能調(diào)用.點語法
         2.返回值沒有提示
NSString *str = [Son person];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市趾牧,隨后出現(xiàn)的幾起案子检盼,更是在濱河造成了極大的恐慌,老刑警劉巖翘单,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吨枉,死亡現(xiàn)場離奇詭異,居然都是意外死亡哄芜,警方通過查閱死者的電腦和手機貌亭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來认臊,“玉大人圃庭,你說我怎么就攤上這事∈纾” “怎么了剧腻?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長涂屁。 經(jīng)常有香客問我书在,道長,這世上最難降的妖魔是什么拆又? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任儒旬,我火速辦了婚禮,結(jié)果婚禮上遏乔,老公的妹妹穿的比我還像新娘义矛。我一直安慰自己发笔,他們只是感情好盟萨,可當(dāng)我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著了讨,像睡著了一般捻激。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上前计,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天胞谭,我揣著相機與錄音,去河邊找鬼男杈。 笑死丈屹,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播旺垒,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼彩库,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了先蒋?” 一聲冷哼從身側(cè)響起骇钦,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎竞漾,沒想到半個月后眯搭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡业岁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年鳞仙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笔时。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡繁扎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出糊闽,到底是詐尸還是另有隱情梳玫,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布右犹,位于F島的核電站提澎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏念链。R本人自食惡果不足惜盼忌,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望掂墓。 院中可真熱鬧谦纱,春花似錦、人聲如沸君编。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吃嘿。三九已至祠乃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間兑燥,已是汗流浹背亮瓷。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留降瞳,地道東北人嘱支。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親除师。 傳聞我的和親對象是個殘疾皇子赢织,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容