Effective系列-01
1. import 與向前聲明(forward declaring)
1.import
當(dāng)我們創(chuàng)建一個(gè)類時(shí),系統(tǒng)會(huì)在這個(gè)類的頭文件中自動(dòng)替我們import需要的框架
//Person.h
#import <Foundation/Foundation.h>
//或者當(dāng)創(chuàng)建視圖椒涯、控制器相關(guān)的類時(shí)
//#import <UIKit/UIKit.h>
這是在頭文件中必不可少的import贩毕,當(dāng)我們認(rèn)為每一個(gè)Person都需要一個(gè)Job時(shí)陈莽,則需要給我們創(chuàng)建的Person類添加一個(gè)實(shí)例對(duì)象
@property (nonatomic,strong) Job *job;
此時(shí)贱傀,若沒有對(duì)Job類進(jìn)行import押桃,則Xcode會(huì)報(bào)錯(cuò)况毅,因?yàn)闊o法識(shí)別Job類型的變量,為了解決上述情況异吻,我們可以在Person的頭文件中添加代碼
#import "Job.h"
盡管這樣可以解決上述情況裹赴,但不夠優(yōu)雅。當(dāng)我們?cè)?h文件中聲明時(shí)诀浪,我們并不需要知道Job的全部信息棋返,只需要知道有這個(gè)類即可。同時(shí)雷猪,這個(gè)適合聲明的話睛竣,若使用者引入了Person.h文件,則也會(huì)引入Job.h文件求摇,倘若所有的類都如此編寫則會(huì)導(dǎo)致引入一些用不到的內(nèi)容射沟,從而增加編譯時(shí)間。
2.向前聲明(forward declaring)
為了解決上面使用import的問題与境,可以使用向前聲明(forward declaring)验夯。
@class Job;
當(dāng)我們向前聲明了Job后,相當(dāng)于告知Xcode在處理Person.h文件時(shí)摔刁,Job是一個(gè)類挥转。當(dāng)我們?cè)?m文件中需要使用到Job的詳細(xì)信息時(shí),再在.m文件中import簸搞。
但是當(dāng)Person類需要遵循Alive協(xié)議(protocal)時(shí)扁位,若使用向前聲明則會(huì)警告
@protocol Alive;
@interface Person : NSObject<Alive> //Cannot find protocol definition for 'Alive'
所以准潭,當(dāng)我們需要遵循某個(gè)協(xié)議時(shí)使用import是無法避免的趁俊,但是為了減少耦合,我們可以創(chuàng)建一個(gè)單獨(dú)OC文件(.h)用來定義協(xié)議刑然。
但是寺擂,當(dāng)我們使用代理(delegate)時(shí),可以不需要像上述一樣聲明泼掠。在與之相關(guān)的類的.m文件中聲明即可怔软,例如給Person類添加一個(gè)Delegate,我們?cè)赑erson.m文件中這樣寫
//Person.m
#import "Person.h"
@protocol PersonDelegate <NSObject>
- (void) walkingOnTheStreet;
@end
@interface Person()
@property (weak,nonatomic) id <PersonDelegate> delegate;
@end
@implementation Person
@end
而這也是apple推薦的寫法择镇,其UITableViewDelegate挡逼、UICollectionViewDelegate等都是采用這種寫法。
2.多使用字面量語法
所謂字面量語法就是在創(chuàng)建對(duì)象時(shí)腻豌,不調(diào)用方法創(chuàng)建對(duì)象家坎。例如
NSNumber *number1=@1;
NSNumber *number2=@2.2;
NSNumber *number3=@1.3;
使用字面量語法可以簡潔明了地創(chuàng)建對(duì)象嘱能,同時(shí)通過在整數(shù)、浮點(diǎn)數(shù)前加@符號(hào)可以便攜地將其轉(zhuǎn)換為NSNumber類型(NSString也可通過在字符串前加@創(chuàng)建)虱疏,供我們使用惹骂。倘若我們調(diào)用方法時(shí),上述代碼需要寫成如下所示做瞪,十分繁瑣效果卻與上述一樣对粪。
NSNumber *number1=[NSNumber numberWithInt:1];
NSNumber *number2=[NSNumber numberWithFloat:2.2];
NSNumber *number3=[NSNumber numberWithFloat:1.3];
除此之外,還有NSArray装蓬、NSDictionary等著拭。下面為NSArray的兩種創(chuàng)建方法
NSArray *array1=[NSArray arrayWithObjects:object1,object2,object3,nil];
NSArray *array2=@[object1,object2,object3];
創(chuàng)建array1時(shí),由于arrayWithObjects方法的特殊性矛物,在創(chuàng)建時(shí)object為nil則停止茫死,因此倘若object2為nil的話,array1中則只有object1履羞。而使用字面量語法創(chuàng)建的array2峦萎,若在@[]中的object有一個(gè)為nil則會(huì)報(bào)錯(cuò)。此外忆首,使用objectAtIndex方法獲取數(shù)組中的值時(shí)也可以直接使用下標(biāo)替代爱榔。
對(duì)于NSDictionary,使用dictionaryWithObjectsAndKeys:方法時(shí)糙及,value在key的前面详幽,不夠清晰。相比之下使用字面量語法key與value則十分清晰浸锨。
NSDictionary *dic1=[NSDictionary dictionaryWithObjectsAndKeys:@"value",@"key",@123,@"number",nil];
NSDictionary *dic2=@{
@"key":@"value",
@"number":@123
};
因?yàn)橹按赫姓业搅斯ぷ鞔狡福罱厴I(yè)論文也基本完成,因此學(xué)習(xí)了一下Effective Objective-C 2.0柱搜,增強(qiáng)一下自己寫OC代碼的能力迟郎,來為工作做一下準(zhǔn)備。本系列肯定都是由書中相關(guān)的知識(shí)點(diǎn)實(shí)踐后總結(jié)而來聪蘸,更多的是作為筆記的形式宪肖。