NSArray

有順序;固定的,一旦創建,裡面的元素不可變;只能放OC的對象(且任何OC的對象都能放入);不能放nil(有特殊意義,代表數組結束);

創建:

NSArray *array = [NSArray array]; //創建一個空數組

[NSArray arrayWithObject:@"123"];//創建一個帶1個元素的數組

[NSArray arrayWithObjects:@"123",@"345", nil];//創建一個帶多個元素的數組,nil表示數組結束

方法:

[array count]:返回數組中元素個數

[array containsObject:@「123」]:判斷是否包含了某個元素;

[array lastObject]:返回數組的最後一個元素;

[array objectAtIndex:1]:返回在index=1處的元素

[array indexOfObject:@「345」]:返回元素在數組中的位置

[array isEqualToArray:array]:判斷兩個數組裡的元素是否相同

[array makeObjectsPerformSelector:@selector(length)]:讓元素內所有的元素都調用一次元素的方法(這裡是str的length方法);

可帶參數:withObject:執行的方法可帶一個參數(但最多隻能帶一個參數);

[array arrayByAddingObject:@「3」]:添加一個元素,返回一個新數組,原數組array不變;

[array arrayByAddingObjectsFromArray:array2]:將兩個數組合併,返回一個新的數組,原數組都不變;

array3 subarrayWithRange:NSMakeRange(1, 2):截取指定範圍和長度的元素,返回一個新的數組

[array componentsJoinedByString:@「,」]:用指定的分隔符拼接所有的元素,返回一個拼接後的字元串

[array writeToFile:@"/Users/sionfan/work/aaa.xml" atomically:YES];//將數組寫入到文件中;

[NSArray arrayWithContentsOfFile:path]://從文件中讀取一個數組,但文件中的格式必須是和生成的的格式一樣的xml

— 排序 -

[array sortedArrayUsingSelector:@selector(compare:)]:返回一個排好序的新數組,原數組的內容順序都不會改變;會使用對象的指定的方法進行排序;(同java,需要在對象的類中實現一個比較方法,如-(NSComparisonResult)compareStudent:(Student *)stu;);

利用block排序sortedArrayUsingComparator,(同java)需要修改自動生成的方法的形參名:

//利用block進行排序

NSArray *stus3 = [stus sortedArrayUsingComparator:^NSComparisonResult(Student *obj1, Student *obj2) {

//先按姓排序

NSComparisonResult result = [obj1.lastName compare:obj2.lastName];

if (result == NSOrderedSame) {

//姓相同

result = [obj1.fistName compare:obj2.fistName];

}

return result;

}];

— 多條件排序 sortedArrayUsingDescriptors:desces—

//先按書名排序,對應上student類中book.bookName的名字;

NSSortDescriptor *bookDesc = [NSSortDescriptor sortDescriptorWithKey:@"book.bookName" ascending:YES];

//再按姓進行排序

NSSortDescriptor *lastDesc = [NSSortDescriptor sortDescriptorWithKey:@"lastName" ascending:YES];

//再按名進行排序

NSSortDescriptor *firstDesc = [NSSortDescriptor sortDescriptorWithKey:@"firstName" ascending:YES];

//順序添加排序描述器到數組

NSArray *desces = [NSArray arrayWithObjects:bookDesc,lastDesc,firstDesc, nil];

NSArray *stus5 = [stus sortedArrayUsingDescriptors:desces];

@[@「,@「」」];可直接創建一個數組,但是不可變數組(NSArray)

++ 遍歷(4種方式) +

for(int i;i<count;i++){id obj = [array objectAtIndex:i]};

for(id *str in array){..str..};//快速遍歷

[array enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

//id obj:遍歷到的對象

//idx :遍歷到的位置

//stop:是否要中止遍歷;*stop = YES;//加*才能改變外面的bool值

NSLog(@"%@,%i",obj,idx);

}];

迭代器遍歷

//迭代器遍歷,先產生一個迭代器

//正向迭代器

// NSEnumerator *enumerator = [array objectEnumerator];

//返序迭代器,從末尾迭代

NSEnumerator *enumerator = [array reverseObjectEnumerator];

//獲取下一個需要遍歷的元素

id obj = nil;

while(obj = [enumerator nextObject]){

NSLog(@"%@",obj);

};

//返回迭代器中所有元素組的一個數組,只取出沒有遍歷過的對象,所有在while遍歷後為空

NSArray *array2 = [enumerator allObjects];

++ NSMutableArray ++繼承自NSArray,可變數組

實現所有NSArray的方法;

增加add***,insert**,replace**及remove**方法;[調用一次add**方法會調用元素retain操作,計數器值+1;調用一次remove**方法會調用元素的release操作,計數器值-1;以此保證不會內存泄露]

[排序:由於可變,可直接對本數組進行排序,故對應的方法多了三個沒有_ed的排序方法,可直接對原數組進行排序]

只能添加不為nil的OC對象

** 內存管理 **

當把一個對象塞進一個數組中時,這個對象的計數器會加1;

//當數組被銷毀時,會對內部的所有元素都做一次release操作;

[array release];

+ NSSet (同java中的set,不常用)

++ NSDictionary ++字典,通過惟一的key找到對應的value(類似於java中的map)

NSDictionary是不可變的;一旦創建就不可再更改;不能放基本數據和nil;只能放OC對象;(key唯一)

— 創建 —

[NSDictionary dictionary]:

[NSDictionary dictionaryWithObject:@"v" forKey:@「key」];

[NSDictionary dictionaryWithObjectsAndKeys:@"v2",@"k1",@"v3",@"k2", nil];

[NSDictionary dictionaryWithContentsOfFile:path]:從一個文件讀取並生成一個map;但必須先是生成格式的xml

[NSDictionary dictionaryWithObjects:objects forKeys:keys];

— 方法 —

[dict count]:有幾個鍵值對;

[dict objectForKey:@「k1」]:通過key找value;但只能取,不能改;

[dict writeToFile:@"/Users/sionfan/work/ddd.txt" atomically:YES]; //將字典寫入到一個文件中,也是生成一個xml文件;

[dict allKeys]:所有的key的NSArray(無順序)

[dict allValues]:所有的value的NSArray(無順序)

[dict3 objectsForKeys:[NSArray arrayWithObjects:@"k1",@"k2",@"k3", nil] notFoundMarker:@「notfound」];//用一組keys找一組values;notFoundMarker是沒有的找到時的返回值,不能為nil;

[dict keysSorted***:]對keys進行排序;相當於對keys這個NSArray進行排序,方法也類似;

—遍歷—

//1.循環遍歷

for(id key in dict3){

NSLog(@"%@ = %@",key,[dict3 objectForKey:key]);

}

//2.迭代器遍歷 key迭代器

NSEnumerator *keyEnumerator = [dict3 keyEnumerator];

//value迭代器

// NSEnumerator *valueEnumerator = [dict3 objectEnumerator];

id key = nil;

while (key = [keyEnumerator nextObject]) {

NSLog(@"%@ = %@",key,[dict3 objectForKey:key]);

}

//3.block迭代器遍歷

[dict3 enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {

//*stop=YES,停止遍歷

NSLog(@"block %@ = %@",key,obj);

}];

— NSDictionary內存管理—同NSArray;在創建時對象引用+1;在調用remove**方法時會對remove的對象調用一次release操作;當dict銷毀時也會對裡面所有的key和value執行一次release操作(計數器值-1);

++NSMutableDictionary++是NSDictionary的子類

增加修改類的方法

set***;add***;remove***;replace***

[void * 代表任何指針]

[在對json數據解析時,若數據的值為null或為空;則不會創建這個鍵值對]

++ NSValue ++

用於包裝結構體,也能包裝任意類型(包裝基本類型)。

包裝:valueWith**:

解包:**Value:

對於自定義的結構體:

Date date = {1999,9,12};

char *type = @encode(Date);//根據結構體類型生成對應的類型描述字元串

NSValue *dateValue = [NSValue value:&date withObjCType:type];

//取出時,先定義一個結構體

Date d2 ;

//取出放入的值

[dateValue getValue:&d2];

//取出放入的objcType

[dateValue objCType];

++ NSNumber ++繼承自NSValue

由於字典和數組不能放入基本數據,故需要轉換;這裡可用NSNumber來包裝。但不像java那樣自動打包解包;放入什麼,取出來就是什麼;(但只能包裝基本數據,不能包裝結構體)

初始化:

numberWith**(基本類型:)

還原成基本類型:init**;

++ NSNull ++

由於集合中不能放空(nil);為了達到能放入一個空值,就使用NSNull。是一個OC對象。

創建:只有一個方法 [NSNull null]:

是單例的(所有的對象指向的都是同一塊地址)

++ NSDate ++時間相關

//NSData,是一個位元組數組(類似於Java中的byte[]);

//NSDate纔是時間

NSDate *date = [NSDate date];//返回當前時間

NSLog(@"%@",date);

//單位是秒,IOS中的時間都是以秒為單位

date = [NSDate dateWithTimeIntervalSinceNow:10];//以當前時間+10

NSLog(@"%@",date);

date = [NSDate dateWithTimeIntervalSince1970:100];//以70-1-1年的時間開始增加,將long型毫秒值轉成Date

NSLog(@"%@",date);

date = [NSDate distantFuture];//隨機的返回一個將來的時間

date = [NSDate distantPast];//隨機的返回一個過去的時間

NSTimeInterval interval = [date timeIntervalSinceReferenceDate];//返回毫秒數long

// [date timeIntervalSince1970];//返回當前時間的毫秒值

// [date isEqualToDate:[NSDate date]];//比較兩個時間是否相同

// [date earlierDate:date1];//返回比較早的那個時間

// [date laterDate:date1];//返回比較晚的那個時間

//時間格式化

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

formatter.dateFormat = @"yyyy-MM-dd hh:mm:ss";

NSString *time = [formatter stringFromDate:date];//將日期轉換成string

time = @"2016-02-03 10:23:30";

date = [formatter dateFromString:time];//將string轉換成日期

NSCalendar *calender = [NSCalendar currentCalendar];//類似於Java中 Calender

++ NSObject ++與反射

id stu = [Student new];

//isKindOfClass 判斷對象是否屬於某個類 或者 子類

if ([stu isKindOfClass:[Student class]]) {

NSLog(@"屬於這個類");

}

//isMemberOfClass 判斷對象是否屬於某個類(但不包括子類)

if([stu isMemberOfClass:[Student class]]){

NSLog(@"屬於這個類");

}

//間接調用對象的方法,還要帶其他參數

// [stu performSelector:@selector(test)];

//延遲調用,在IOS中才有用,main是循環的,才能執行,在命令行的項目中,main只有一次,不能延遲

// [stu performSelector:<#(nonnull SEL)#> withObject:<#(nullable id)#> afterDelay:<#(NSTimeInterval)#>]

//其他線程調用對象的方法

// [stu performSelectorOnMainThread:<#(nonnull SEL)#> withObject:<#(nullable id)#> waitUntilDone:<#(BOOL)#>]

++ 反射 ++

//反射,通過字元串生成一個對象

NSString *str = @"Student";

Class class = NSClassFromString(str);

//類的反射

Student *stu = [[class alloc] init];

//Class 變成字元串

// NSString *name = NSStringFromClass([Student class]);

NSLog(@"%@",stu);

//方法的反射

NSString *method = @"test";

//得到方法

SEL selector = NSSelectorFromString(method);

//執行方法

[stu performSelector:selector];

//將SEL轉化為字元串

NSString *selectorName = NSStringFromSelector(selector);

++ copy ++

目的:就是對一個對象和集合的拷貝,改變副本不影響原對象(同java中的clone)。

*創建不可變副本(copy):要先實現NSCopying協議,創建的是不可變副本(NSString,NSArray);

*創建可變副本(mutableCopy),要實現NSMutableCopying協議,用於創建可變副本(NSMutableString,NSMutableArray);

深拷貝(mutableCopy,內容拷貝):是會產生一個新的對象,是真正的拷貝,從內存中拷貝出一份,並指向它。新對象的計數器值為1,原對象的計數器值不變。

淺拷貝(copy):只是簡單的指針拷貝(地址拷貝)。如對於如NSString的對象,由於這類對象本身不可改變,為了性能提升,故copy方法不會創建一個新的對象,是將原對象本身返回,且原對象的計數器+1(相當於retain操作)

[兩者區別是有沒有產生新對象;但還有特殊情況,是NSMutableString str=..;NSString *str2 = [str copy];

//可變對象 ——> 不可變對象 和 不可變對象 ——> 可變對象,由於拷貝出的對象與原對象的結構都不一樣,所以不能簡單的指針拷貝,故是深拷貝。(只有一種情況:不可變—copy—>不可變纔是淺拷貝)]

在定義對象時用copy: @property (nonatomic,copy) NSString *lastName;//修改外面的變數,不會影響到內部的成員變數(對於固定的NSString一般用copy,不允許隨便修改)

則代表在set方法中,會release舊對象,copy新對象:[_lastName release];_lastName = [lastName copy];

在外面用操作mutable時,就不會改變對象中的值:NSMutableString *string = …; stu.lastName = string;//賦值; [string appendString@「..」];//改變賦值的字元串,則不會改變對象中的字元串的值。(用retain,則對象中的值會改變)

使用copy時,建議使用[self class]代替類名;

[子類繼承父類,在構造方法時,實例化使用Student *stu = [[[self class] alloc] init];//讓子類來調用父類的方法,不然父類可能調用到子類的方法,出現找不到方法的錯誤]


推薦閱讀:
相關文章