/*編程
字符串:json
NSString 不可變字符串 字符串對象的內容不能修改,字符串的指針能夠改變設計模式
NSMutableString 可變字符串 能夠修改字符串對象的內容,繼承自NSString ,具備全部的方法數組
*/緩存
1.建立對象,實例方法和類方法網絡
NSMutableString *mStr=[[NSMutableString alloc]initWithString:@"Hello World"];less
2.將不可變字符串轉換爲可變字符串函數
NSMutableString *mStr2=[NSMutableString stringWithString:@"Hello"];ui
3.將C字符串轉換爲OC字符串編碼
char *ch;
[NSString stringWithUTF8String:ch];
4.查找子字符串的範圍
NSRange range=[mStr3 rangeOfString:@"beijing"];
//從後往前搜索/
NSRange rang=[path rangeOfString:@"/" options:NSBackwardsSearch];
NSRange range=NSMakeRange(1, 2);
5.將範圍內的字符串刪除
[mStr3 deleteCharactersInRange:range];
6.在指定範圍內,將全部的子字符串用另外一個字符串替換,查找時可設置選項
[mStr3 replaceOccurrencesOfString:@"a" withString:@"b" options:NSLiteralSearch range:NSMakeRange()];
[path stringByReplacingOccurrencesOfString:@"//" withString:@"/"];
7. 以/根目錄開始的BOOL
[path hasPrefix:@"/"]
判斷路徑是否以/結尾
[path hasSuffix:@"/"]
8.
substringFromIndex
substringToIndex
9.獲取文件擴展名
NSRange range=[path rangeOfString:@"." options:NSBackwardsSearch];
if (range.location!=NSNotFound) {
return [path substringFromIndex:range.location+1];}
10.比較大小
[s1 compare:s2];//區分大小寫
[s1 caseInsensitiveCompare:s2]//忽略大小寫
[s1 compare:s2 options:NSNumericSearch];//只會按照字符串中不一樣的數字大小決定字符串的大小
isEqualToString
11.轉換爲大小寫
[s1 uppercaseString]
[s2 lowercaseString];
12.查找斷定
rang.location!=NSNotFound
13.
unichar c=[str characterAtIndex:i];//倒置時有用
/*
NSNumber 數字類 將基本數據變量封裝成數字對象 打包 裝箱
*/
1.比較大小 NSNumber對象中數據的大小
NSComparisonResult res=[intNumber compare:floatNumber];
2.比較兩個NSNumber 對象中數據是否相等
[intNumber isEqualToNumber:floatNumber]
/*
數組分類:
NSArray不可變數組,初始化數組對象後,數組中的元素不能修改(只能查詢遍歷)
NSMutableArray 可變數組,繼承自NSArray,數組中的元素能夠修改[增長,刪除,修改元素和修改數據的內容]
*/
1.
OC中的數組是一個對象,是任意類型對象地址的集合
對象和數組都在堆裏面,引用和基本數據類型放在棧裏面
數組中能夠存聽任意類型的對象,可是不能存放基本類型的數據
2.
數組中的元素是有序的,能夠重複
3.
id類型的引用,點語法就沒法使用啦
4.
[array containsObject:obj]
5.
[array indexOfObject:@"four」]//獲取下標
6.
NSEnumerator * enumerator=[array objectEnumerator];//遍歷數組建立迭代器對象
id obj;
while (obj=[enumerator nextObject]) {
XXXXXXXXXXX
}
7.
removeObjectsInArray
removeObjectsInRange:range
removeObjectsInRange:range
8. 交換
[array1 exchangeObjectAtIndex:0 withObjectAtIndex:2];//交換元素
9.將數組中的各個元素用指定的字符串鏈接成一個行的字符串
NSString *s=[array componentsJoinedByString:@" "];
NSArray *a=[s componentsSeparatedByString:@"*"];
NSArray *a2=[s2 componentsSeparatedByCharactersInSet:[NSCharacterSet
characterSetWithCharactersInString:@"!*"]];
NSNull:至關於NULL,表明一個空類,只有一個類方法,獲取一個空實例或者空對象
/*
多態:一種事物,多種形態,使不一樣的類共享相同方法名稱———————多態
*/
1.
調用方法時,根據的是對象,不是指針
2.
父類的引用能夠指向子類對象,賦值,兼容
3.
isMemberOfClass//判斷是否屬於XX類
isKindOfClass//判斷是不是XX或其子類類型的對象 類自己也是一個對象
isSubclassOfClass//判斷一個類是不是另外一個類的子類
/*
繼承的使用:當多個類有不少相同的代碼時,能夠將相同的部分提取出來寫成父類
若是類A徹底擁有類B的全部成員,能夠考慮類A繼承類B,也能夠考慮組合
注意:子類中不能出現與父類相同的成員變量
子類的對象調用方法時,優先去子類中查找,再去父類中查找,若是存在就調用執行,不存在就出錯
繼承體現了類之間的關係,繼承關係
繼承的缺點:類之間的耦合型太強
*/
1.
@protected接口中定義的變量默認
@private//實現中默認是這種
@synthesize name=_name;//將屬性和變量關聯起來合成方法
2.
方法重寫:子類中的方法頭與父類的徹底一致
3.
super:當子類重寫父類的方法,又須要保留父類的某些功能時,採用super 調用
4.
- (id)init{}注意初始化方法,特別是對成員變量的初始化,如數組
/*
Category 類別 分類 類別,它不是類
在不改變原來類名的基礎上,擴充某個類的功能。
將一個類的實現分爲多個文件,每一個文件都屬於類的定義部分,多用於合做開發
只能增長方法,不能增長變量
*/
1.
主類和分類(類別)
2.
主類中的方法被類別中的方法覆蓋(重寫),沒法再調用
3.
子類也能夠繼承擴展功能
4.
@interface 主類(分類名)
/*
Extension 至關於未命名的Category,能夠給類增長方法,也能夠增長成員變量,只有.h文件,方法的實如今主類中
*/
1.
@interface Person ()
-(void)play;
@end
/*
字典:讀取網絡數據,通常是字符串
NSDctionary 是一個集合對象,字典中的元素以鍵-值對的形式存在,元素是任意類型的對象
key 不能重複,value 能夠重複,通常根據key 查找value
分爲(元素必須是對象地址,不能使基本數據類型)
NSDctionary 不可變字典:字典初始化後不能修改其中的元素,只能訪問
NSMutableDictionary可變字典:字典初始化後能夠修改其中的元素,(增長,刪除,修改)
大量數據用數組存儲
*/
1.
快速建立子字典對象(先寫鍵,再寫值key:value)
NSDictionary *dict=@{@"1":@"one",@"2":@"two",@"1":@"one1",@"20":@"two",@"3":@"three"};
2.
取值(爲無序的)
NSArray *allkeys=[dict allKeys];
NSArray *allValues=[dict allValues];//鍵重複的不會出現
for (NSString *key in [dict allKeys])//遍歷字典頗有用
3.
根據值獲取全部對應的鍵
NSArray *keys=[dict1 allKeysForObject:@"two"];
可變字典
4.
將另外一個字典中的元素加進來
[dict addEntriesFromDictionary:dict2];
[dict setDictionary:dict2];
5.
[dict setObject:@"five" forKey:@「5」]//設值或者修改
6.
刪除
[dict removeObjectForKey:@"1"];
[dict removeObjectsForKeys:array];
/*
Class
類的本質也是一個對象 是Class類型的類對象,一個類只有一個類對象,全部的類都屬於Class類型
*/
1.
獲取類對象,能夠給實例發送class消息,也能夠給類發送class消息
2.
load 當程序啓動是會加載全部的類,而後調用load方法,通常先調父類的方法
initialize 當這個類第一次使用時,會調用
/*
NSSet
集合對象,與數組相似,可是NSSet是無序的,不能存放重複的元素,惟一的索引
分爲:
NSSet 不可變集合
NSMutableSet可變集合
*/
1.
#define ITOBJ(n) [NSNumber numberWithInt:n]
NSSet *set=[[NSSet alloc]initWithObjects:]
2.
獲取兩個集合的並集
[set2 unionSet:set1];
獲取兩個集合的交集
[set2 intersectSet:set1];
獲取兩個集合的差集//減去set2中相同的
[set2 minusSet:set1];
取出集合中任意一個元素,(主要應用於只有一個元素的集合)
id obj= [set anyObject];
將集合轉換爲數組
NSArray *array=[set allObjects];
/*
NSIndexSet
索引集合,惟一的整數集合
分爲
NSIndexSet不可變:初始化時指定索引範圍NSMakeRange
’NSMutableIndexSet可變:能夠向其中添加不連續的索引 addIndex
*/
/*
NSValue
將結構體,指針變量封裝成對象/取值
結構體是(基本類型),不能存放到數組中,須要將其封裝成對象
*/
1.
將結構體變量封裝成對象
struct mystruct sm={1,2};
NSValue *value=[[NSValue alloc]initWithBytes:&sm objCType:@encode(struct mystruct) ];
2.
取出NSValue中的結構體變量
struct mystruct sm2;
將value中的結構體變量取出來賦給sm2
[value getValue:&sm2];
3.
指針
NSValue *value=[[NSValue alloc]initWithBytes:&p objCType:@encode(char *) ];
4.
常見結構體(NSRect CGPoint NSPoint NSSize NSRange)
NSPoint pt=NSMakePoint(100, 200);
經過類方法將結構體變量封裝成id對象
NSValue *value=[NSValue valueWithPoint:pt];
取出NSValue對象中的NSPoint的值
NSPoint pt2=[value6 pointValue];
/*
SEL
是一個類型,將方法封裝成一個SEL的數據,能夠根據封裝的方法獲取方法的地址,調用相應的方法
相似於c中的函數指針
封裝當成實參
*/
1.
執行相應的sel對象
[obj performSelector:@selector(方法)];
2.
判斷對象是否能夠響應相關的方法
[obj respondsToSelector:@selector(方法)]) {
3.
帶參
[obj performSelector:@selector(方法) withObject:argc];
4.
將字符串形式的方法封裝成SEL類型的數據
SEL sel=NSSelectorFromString(@「方法名」);
5.
對不可變數組的排序
[array sortedArrayUsingSelector:(SEL)];
[array sortUsingComparator:塊]
/*
NSDate
時間日期類
*/
1.
NSDate * date=[NSDate new];
NSDate * date1=[[NSDate alloc]init];
NSDate * date2=[NSDate date];
2.
NSTimeInterval interval=[date2 timeIntervalSinceDate:date1]
3.
格式化日期類
NSDateFormatter *formatter=[[NSDateFormatter alloc]init];
設置日期和時間的顯示樣式
[formatter setDateStyle:NSDateFormatterFullStyle];
[formatter setTimeStyle:NSDateFormatterShortStyle];
NSString * sDate=[formatter stringFromDate:date];
自定義格式字符串
[formatter setDateFormat:@"yyyy-MM-dd hh:mm:ss"];
NSString * s=@"2015-11-11 10:10:10";
NSDate *date=[formatter dateFromString:s];
/*
NSFileHandle
對文件進行讀寫操做的類
*/
1.
NSData *da=[str dataUsingEncoding:NSUTF8StringEncoding];
2.
讀取
NSFileHandle *readHandle=[NSFileHandle fileHandleForReadingAtPath:@""];
NSData *data=[readHandle readDataToEndOfFile];
寫入
NSFileHandle *writeHandle=[NSFileHandle fileHandleForWritingAtPath:@""];
清空文件內容
[writeHandle truncateFileAtOffset:0]
[writeHandle writeData:data]
3.
設置讀取文件開始的偏移值
[writeHandle seekToEndOfFile]
4.
[writeHandle closeFile];
/*
NSFileManager
文件管理,單例類,對文件/目錄進行管理的類(建立,copy,delete,move)
*/
1.
類方法獲取單例對象
NSFileManager * manager=[NSFileManager defaultManager];
2.
判斷文件(夾)是否存在
BOOL res=[manager fileExistsAtPath:@"/test.txt" ];
BOOL isDir;
BOOL res=[manager fileExistsAtPath:@"/test.txt" isDirectory:&isDir];
3.
拷貝(若是目標目錄中已經出現同名的文件,將會出錯)
copyItemAtPath toPath
文件重命名:若是文件處於同一目錄下就是重命名,若是不在同一個目錄下,移動(並重命名)
移動文件,必定要指定移動的目標目錄的文件名(目錄路徑不能只寫到目錄)
moveItemAtPath toPath
刪除指定路徑下的文件
removeItemAtPath
獲取指定路徑下的文件的屬性,返回字典
manager attributesOfItemAtPath
屬性:NSFileSize NSFileType
ej:[dict objectForKey:NSFileSize]
4.
獲取當前路徑,該應用生成的可執行文件的路徑
NSString *path=[manager currentDirectoryPath];
5.
建立指定路徑下的目錄,
第二個參數是當目標目錄的上級目錄不存在的時候是否須要也要建立出來,
第三個參數是建立目錄的初始化屬性,
第四個參數是建立過程當中有木有放生錯誤。
res=[manager createDirectoryAtPath:@"test/a/b/c" withIntermediateDirectories:YES attributes:nil error:nil];
6.
淺遍歷,返回當前目錄下的子目錄和文件名,數組(都是相對路徑,只是深度只有本目錄,一層)
NSArray *array=[manager contentsOfDirectoryAtPath:@"Manager/test" error:nil];
深遍歷:返回以當前目錄爲參照,當前目錄下全部的子目錄(以及子目錄下的目錄和文件,多層),和文件名,(以當前目錄的基準的路徑名)
其中都是相對路徑===========如需訪問,須要拼接父目錄
NSArray * array=[manager subpathsOfDirectoryAtPath:@"eManager/test"error:nil];
7.
獲取當前路徑,該應用生成的可執行文件的路徑
NSString *path=[manager currentDirectoryPath];
res=[manager fileExistsAtPath:@"oc.txt"];
8.
獲取文件內容
NSData 當將數據寫入文件或傳輸到網絡,從網絡獲取數據,須要將其轉換爲純粹的二進制字節流NSData,至關於c中的
char buf[128],做爲數據的緩衝區
NSData * contents=[manager contentsAtPath:@「/Manager/2.txt"];
NSData->NSString
NSString *str=[[NSString alloc]initWithData:contents encoding:NSUTF8StringEncoding];
將內容字符串一次性的寫入文件
NSString * str2=@"beijing shanghai shenzhen";
NSString->NSData
NSData *data=[str2 dataUsingEncoding:NSUTF8StringEncoding];
建立文件時指定文件內容
res=[manager createFileAtPath:@「/Manager/1.txt" contents:data attributes:nil];
readFromFile
1.initWithContentsOfFile/stringWithContentsOfFile
2.NSFileHandle->fileHandleForReadingAtPath->readHandle->[readHandle readDataToEndOfFile];
3.NSData * contents=[NSFileManager contentsAtPath:@「/Manager/2.txt"];
//NSData->NSString
NSString *str=[[NSString alloc]initWithData:contents encoding:NSUTF8StringEncoding];
writeToFile
1.NSString
2.NSFileManager createFileAtPath
3.NSFileHandle->fileHandleForWritingAtPath->writeHandle->[writeHandle writeData:data];
4.NSMutableArray writeToFile atomically是否中間使用緩存文件,及備份文件
5.字典的寫必須其中的對象所有爲字典對象,或者字典數組
/*
單例
是一種編程思想,與語言無關
是一種常見的設計模式,在採用單例模式的應用中,單例對象的類必須保證只有一個實例存在,自行實例化,並向整個應用程序提供使用
對一個單例類,不論實例化多少次,都只有一個對象存在,並且能被整個應用程序訪問,相似於全局變量能夠在整個項目中共享數據
@synchronized(self) 實現數據同步
本質是裏面有一個靜態的變量在裏面,單例的生命週期和應用相同
手動內存管理中單例對象的內容不須要釋放
1 單例類只有一個實例存在
2.類方法獲取對象
3.單例對象至關於全局變量使用共享數據
*/
1.
獲取單例對象的方法通常以default/shared/current/standedXX開頭
/*
文件存儲
經過文件實現持久化存儲
*/
1.
將數據寫入文件
-(void)writeToFile:(NSString *)file;
從文件獲取數據
-(void)readDataFromFile:(NSString *)file;
/*
文件歸檔:
歸檔是一個過程,用某種格式保存對象,以便之後還原對象,這個過程包括將(多個)對象寫入文件,之後在從文件讀取
(1)將對象歸檔爲pList文件.(數組或字典對象,元素只能是NSString NSNumeber BOOL NSDate NSData類型)
(2)自定義對象使用歸檔器歸檔,歸檔協議—>統一接口
*/
/*
NSKeyedArchiver:對自定義的對象編碼歸檔
編碼:就是將對象的成員變量轉換爲文件能夠識別和存儲的類型
NSKeyedArchiver建立帶鍵的檔案
歸檔是對每一個字段設置一個key
從文檔中讀取數據時,在根據key取值
能夠對數組,字典,自定義的對象歸檔
組合類的解歸檔都要遵照歸檔協議NSCoding
NSKeyedUnarchiver: 解歸檔
*/
1.
對數組對象歸檔
BOOL [NSKeyedArchiver archiveRootObject:array toFile:@「1.data"];
2.
從文檔中讀取對象
NSArray *array=[NSKeyedUnarchiver unarchiveObjectWithFile:@"1.data"];
3.
若是自定義的對象須要歸檔,必須遵照歸檔協議
解歸檔時,調用此方法給對象初始化
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];//若是父類也遵照歸檔協議self=[super initWithCoder:aDecoder]
if (self) {
_name=[aDecoder decodeObjectForKey:@"name"];
}
return self;
}
在歸檔時自動調用此方法,對對象的成員變量轉化爲能夠識別的編碼類型
-(void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:_name forKey:@"name"];
}
/*
Protocol:協議
@protocol 關鍵字 協議名字<基協議> 相似實現多繼承
約定方法,統一接口
協議不引用任何類,它是無類的(classless)
定義了協議的類能夠看作是將協議定義的方法代理給了實現他們的類,這樣,類的定義就可更加通用啦
協議中只能有方法的聲明,不能定義成員變量
@optional 非正式協議(實際上是一個分類,也叫抽象協議)可選的
@required 默認是必須實現的
*/
1.
方法中參數定義
id<Protocol>:限定id類型,表示obj能夠指定任意類型的對象,可是這個對象必須遵照Protocol協議
能夠用來當作函數形參,限制了形參傳遞的類型
2.
判斷obj5對象是否遵照這個協議
if ([obj conformsToProtocol:@protocol(MyProtocol)]) {
判斷obj5所在的類是否實現了方法
if ([obj respondsToSelector:@selector(test)]) {
[obj test];
}
}
3.
協議能夠統一接口
繼承和協議均可以統一接口
繼承:子類繼承父類的方法,子類和父類的方法名同樣,(除非父類的方法不適合子類,子類會重寫,重寫後的方法名與父類中的方法名還
是同樣),達到了同一接口的目的,子類能夠繼承父類的成員變量
協議:一個類遵照協議,這個類就擁有了協議中的方法,若是多個類遵照一個協議,這些類都擁有協議的方法,方法名都同樣,實現了統一
接口的目的,協議中不能有成員變量(未命名類別extension)
4.
一個類能夠遵照多個協議。
一個協議能夠遵照另外一個協議
/*
內存管理:
OC中內存管理主要是對對象管理(凡是繼承於NSObject),對基本類型無效
OC中內存廣利採用的是引用計數器,ARC自動引用計數
分爲ARC(automatic reference counting)和MRC(manual reference counting)
其實是一個整數,代表對象的引用次數(有多少我的在使用它),
每一個對象都有一個引用計數器,會分配4字節的空間存儲
當採用alloc或者new,copy[mutablecopy]新建立一個對象時,引用計數器的默認值是1
當引用計數器值爲0時,該對象會被釋放,所佔內存會被回收,也就是說,當一個對象的引用次數 值不爲0時,會一直存在,除非程序退出
給對象發送retain消息,使引用計數器值+1,方法返回對象自己
給對象發送release消息,引用計數器-1
給對象發送retainCount消息,能夠得到引用計數器的值
當引用計數器值爲0時,對象會被釋放,會自動發送dealloc消息,通常重寫dealloc方法,釋放相關資源,一旦重寫dealloc方法,必定要
調用[super dealloc] 通常放在最後,dealloc方法是自動調用的,不能手動調用
*/
1.
內存管理-黃金法則
若是對一個對象使用了alloc、[mutable]copy、retain,那麼你必須使用相應的release或者autorelease配對操做
2.
引用計數: retainCount
3.
OC中能夠給空引用發送消息,nil,(相似於C語言不能對空指針操做)
4.
已經被釋放內存的對象爲殭屍對象,給殭屍對象發送的消息會出現錯誤
message send to deallocated instance
指向一個已經釋放對象的內存,(不可用)的指針叫野指針,對野指針 操做會出現問題,能夠給引用賦值nil
5.
assign:
-(void)setBook:(Book *)book{
_book=book;
}
retain:
-(void)setBook:(Book *)book{
if (_book!=book) {
[_book release];
_book=[book retain];
}
}
析構函數
- (void)dealloc{
[super dealloc];調用父類的方法,通常放在最後
}
6.
建立數組用對象初始化時,會給對象的引用計數器+1
向數組中添加元素時,會給對象的引用計數器+1
從數組中刪除元素時,會給對象的引用計數器-1
當數組釋放時,會給其中全部的對象發送release 消息
7.
循環引用:
在ARC中
若是出現兩個對象的兩個指針相互引用,會出現內存泄露,內存管理的基本法則也不適用
解決方法:將一端適用retain 另外一端使用assign
聲明屬性:對象用strong weak(不多用)
基本類型有assign
8.
ARC環境下,與內存管理相關的代碼都不能調用,自動釋放對象
何時被釋放,看對象是否有強引用指向
強引用strong:默認的指針都是強引用
弱引用weak:__weak 立刻會被釋放
屬性的聲明:
strong 自動ARC下對象的引用
retain 非ARC下對象的引用
對於非ARC環境下的文件,右鍵build phases,compiler flags添加如下命令
-fno-objc-arc
9.
對引用計數器的改變
1.retain 2.release
通常不使用autorelease
autorelease 延遲釋放,將對象加入最近的(棧頂)的自動釋放池中,當池子被銷燬時,會給池子中全部的對象發送release消息。
autorelease方法返回對象自己,給對象發送autorelease 消息後,對象的引用計數器不變
好處:不用擔憂對象的釋放時間
壞處:對於大對象不可以精確控制對象的釋放時間
除非萬不得已,不要使用autorelease,建議使用release
自動釋放池:
IOS5.0後@autoreleasepool{}
IOS5.0以前
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];
**
中間是管理的對象的代碼
**
[pool release];
10.
@class
1.解決頭文件互相包含
2.只知道引用了一個類,不關心內部結構,提升效率
3.若是要使用成員,就必須import
/*
代理:
真正的實現者,編程思想
我的理解:
用戶是主動方(能夠將協議放在制定協議的一方(主動方))
需求(協議)
開發人員就是代理,根據需求(協議)設計不一樣的方法
*/
1.
使用協議,類能夠單獨存在,下降和其餘類之間的耦合性,限定符
@property(nonatomic,strong)id<protocol> delegate;
2.
在代理模式中,會出現兩個對象的指針互相引用,會形成內存泄露。
通常將delegate設置爲assign(weak),內存管理中沒有強指針指向時就會被釋放。
通常主動方會做爲被動方的成員存在,主動方在,被動方就存在,採用strong標記。
代理調用的是協議方法,下降類之間的耦合性。
/*
複製對象:
mutableCopy Copy
1.字符串
不管原對象是可變不可變:
給字符串對象發送copy 消息,獲得的是一個新的不可變對象
給字符串對象發送mutableCopy 消息,獲得的是一個新的可變對象
2.自定義對象
3.數組
*/
1.
編譯的時候就知道它的類型啦,靜態編譯
聲明爲id類型,運行時纔會肯定指向的對象類型,動態編譯。
2.
淺拷貝:只是拷貝數組對象,數組中的元素沒有拷貝.
深拷貝:不僅是拷貝數組對象,數組中存儲的元素也拷貝.
3.
若是須要copy ,必須遵照NSCopying協議
通常對象用retain(手動),strong(自動),字符串使用copy
4.
retain:共享對象
-(void)setName:(NSString *)name{
if(_name!=name){
[_name release];
_name=[name retain];
}
}
copy:建立新對象
-(void)setName:(NSString *)name{
if(_name!=name){
[_name release];
_name=[name copy];
}
assign:
-(void)setName:(NSString *)name{
_name=name;
}
5.
給對象發送copy消息時,會調用此協議方法
-(id)copyWithZone:(NSZone *)zone{
[self class]獲取當前的類對象,若是是父類調用,獲得的是父類的對象,若是是子類,得到的就是子類的對象
Car *car=[[[self class] allocWithZone:zone]init];對於繼承時,頗有用
}
-(id)mutableCopyWithZone:(NSZone *)zone{
Car *car=[[Car allocWithZone:zone]init];
}
/*
Json解析:
格式的數據:有兩種結構組成
鍵-對象(字典) 鍵都是字符串("":..... , "":.....)
對象的集合:(數組) (, , , ,)
*/
1.
將json對象解碼成對象
[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&err];
2.
將對象編碼成json對象(字典)
[NSJSONSerialization dataWithJSONObject:dict options:NSJSONReadingMutableLeaves error:nil];
/*
XML解析:
xml:extensible markup language :可擴展的標記語言 ,用於存儲傳輸數據
xml數據的解析有兩種:
DOM解析:直接將xml數據加載到內存,從根節點開始,取子節點,一級一級的解析,比較佔內存
SAX解析:基於事件驅動的,讀取xml數據就是解析的過程,速度較快,只是讀取不能修改
採用GData第三方庫解析,使用的是DOM解析的方式,調用底層的libxml2庫文件
(1)導入GData文件
(2)設置頭文件的搜索路徑,選中項目->Build Setting ->Header Search Path 雙擊,單擊+,輸入/usr/include/libxml2
(3)加入底層文件libxml2 選中項目->Build Phases,Link Binary With Libraries,單擊+,添加libxml2
XPath表達式:快速定位到某個標記
/表示從根標記開始
//表示任意位置的標記,知足條件
.表示當前標記
@表示屬性對象
*/
路徑
path=[path stringByAppendingPathComponent:subPath];
pathExtension lastPathComponent lastPathComponent isAbsolutePath