一袍冷、類和對象
1.定義:類是具有相同特征和行為的事物的抽象磷醋,對象是類的具體化,類是對象的類型胡诗。
2.面向?qū)ο蟮娜筇匦?封裝邓线,繼承,多態(tài)煌恢。
3.類對象的關(guān)系
類是對象的抽象骇陈,而對象是類的具體實(shí)例。類是抽象的瑰抵,不占用內(nèi)存你雌,而對象是具體的,占用存儲(chǔ)空間二汛。類是用于創(chuàng)建對象的藍(lán)圖婿崭,它是一個(gè)定義包括在特定類型的對象中的方法和變量的軟件模板拨拓。
4.類類型的聲明
class 類名
{
public:
公用的數(shù)據(jù)和成員函數(shù)
protected:
保護(hù)的數(shù)據(jù)和成員函數(shù)
private:
私有的數(shù)據(jù)和成員函數(shù)
};
5.定義對象方法
1.先聲明類類型,然后再定義對象
2.在聲明類類型的同時(shí)定義對象
二氓栈、繼承和初始化
1.為單一實(shí)例變量賦值的方法叫setter方(設(shè)置器) //setter方法:-號方法,無返回值,set開頭加上對應(yīng)實(shí)例變量的名字(首字母大寫)有且只有一個(gè)參數(shù),參數(shù)的類型和實(shí)例變量的類型相同,參數(shù)名和實(shí)例變量的名相同
2.獲取單一實(shí)例變量的值的方法叫g(shù)etter方法(訪問器) //getter方法:-號方法,有返回值,返回值類型和實(shí)例變量類型相同,方法名get +實(shí)例變量名(首字母大寫),無參數(shù)
3.繼承的優(yōu)勢:其實(shí)就是省代碼,增強(qiáng)程序的可擴(kuò)展性和可修改性.
4.繼承的上層:父類,下層:子類
5.繼承具有單向性:只有單向傳遞,如果a作為b的父類,a就不能再成為b的子類.
6.繼承具有傳遞性:c繼承于b,b繼承于a
4.子類繼承父類的全部實(shí)例變量和方法
5.子類從父類繼承過來的內(nèi)容就是自己的,只不過來源于父類
原則:當(dāng)多個(gè)類中出現(xiàn)部分相同的特征和行為時(shí),可以將相同部分寫成一個(gè)父類,其他類繼承即可.
6.自定義初始化方法的聲明? ? -號方法
- (instancetype)initWith方法名:(參數(shù)類型)參數(shù)名
例如:- (instancetype)initWithName:(NSString *)name;? ? ? ? ? ? ? .h
- (instancetype)initWithName:(NSString *)name{
self = [super init];
if (self) {
_name = name;? }
return self;? ? }? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? .m
7.便利構(gòu)造器? ? +號方法? ? 調(diào)用類方法渣磷,因?yàn)檎{(diào)用的是類方法,沒有進(jìn)行分配空間初始化授瘦,所以在內(nèi)部把對象進(jìn)行初始化醋界,返回對象。
+ (類名 *) (init用小寫類名代替)With方法名:(參數(shù)類型)參數(shù)名
例如:+ (Person*)personWithName:(NSString *)name;
+ (Person*)personWithName:(NSString *)name{
Person *per = [[Person alloc] initWithName:name];
return per;
}
三奥务、屬性
1.是oc2.0版本定義的語法.提供了setter,和getter方法的默認(rèn)實(shí)現(xiàn),在一定程度上提高了我們的代碼效率.并且提高程序的安全性.
2.屬性的聲明:在.h里使用@property聲明屬性.
//@property(readwrite,nonatomic) NSString *name;
3.在.h里聲明setter和getter方法.
4.讀寫性控制:{
readonly:只讀狀態(tài),告訴編譯器,屬性只生成getter方法,不生成setter方法
readwrite:讀寫狀態(tài),告訴編譯器,我么即生成setter方法也生成getter方法,就是設(shè)置器和訪問器都生成(默認(rèn)的讀寫性)
}
5.原子特性:{
atomic:原子性,setter和getter方法在多線程下是完全安全的,即在setter和getter方法內(nèi)對多線程的訪問進(jìn)行了處理,但是他的效率非常的低(默認(rèn)的原子特性)
nomatic:非原子特性,getter和setter方法里內(nèi)部不會(huì)堆多線程的訪問進(jìn)行處理,即這個(gè)setter和getter方法里只實(shí)現(xiàn)我們最基本的setter和getter方法(pass:這是我們最常用的原子特性)
}
6.語義設(shè)置{
如果我們定義的屬性類型是基本類型:(int,float,char,NSInteger)我們都使用語義的設(shè)置是assign
如果我們定義的屬性類型是對象類型:(person *per)
字符串類型我們用的語義設(shè)置是copy
其他類型我們用的語義設(shè)置是retain
}
四物独、字符串
1.字符串的創(chuàng)建.
第一種方式
char a[] = "lanOu";
initWithUTF8String將c語言里的字符串轉(zhuǎn)換為oc里的字符串
NSString *string1 = [[NSString alloc]initWithUTF8String:a];
NSLog(@"%@",string1);
第一種方式的便利構(gòu)造器方法
NSString * string2 = [NSString stringWithUTF8String:a];
NSLog(@"%@",string2);
第二種方式:字面量
NSString *string3 = @"lanOu3g";//字面量(最常用的字符串創(chuàng)建方式)
NSLog(@"%@",string3);
第三種方式(最nb的創(chuàng)建方式)
NSString * string1 = [[NSString alloc]initWithFormat:@"hello lanou"];
NSLog(@"%@",string1);
NSInteger a = 18;
NSString *string2 = [[NSString alloc]initWithFormat:@"%ld",a];
NSLog(@"%@",string2);
int b = 20;
NSString *string3 = [NSString stringWithFormat:@"%d",b];
NSLog(@"%@",string3);
作用1.創(chuàng)建一個(gè)普通的字符串對象.
2.將別的類型的對象轉(zhuǎn)換成字符串類型的對象.
3.字符串拼接.
NSInteger a = 10;
NSString *string = [NSString stringWithFormat:@"%@",@"heihei,小鴨梨"];
NSLog(@"%@",string);
NSString *string2 = @"是帥哥";
NSString *string3 = [NSString stringWithFormat:@"%@%@,是不是?,%ld",string,string2,a];
NSLog(@"%@",string3);
NSString *string =@"小紅";
NSString *string2 = @"今年";
NSString *string3 = @"歲了";
NSInteger string4 = 8;
NSString *string5 = @"真逗比";
NSString *string6 = [NSString stringWithFormat:@"%@%@%ld%@%@,是不是?",string,string2,string4,string3,string5];
NSLog(@"%@",string6);
2.字符串長度.
NSString *string = [NSString stringWithFormat:@"lanOuDaLian"];
NSUInteger length = string.length;//無符號長整形
NSLog(@"%lu",length);
3.獲取字符串中的字符
NSString *string = [NSString stringWithFormat:@"lanOuKeiJi"];//獲取字符串對應(yīng)字符的下標(biāo)
unichar c = [string characterAtIndex:2];
NSLog(@"%c",c);//無符號短整型
4.判斷字符串是否相等
NSString *string1 = @"heihei";
NSString *string2 = @"haha";
if([string1? isEqualToString:string2]){//判斷調(diào)用對象和傳入對象是否相等(判斷內(nèi)容是否相同)
NSLog(@"兩個(gè)字符串相等");
}else{
NSLog(@"兩個(gè)字符串不相等");
}
if( string1 == string2){//判斷字符串的地址是否相同
NSLog(@"地址相同");
}else{
NSLog(@"地址不相同");
}
5.字符串比較
NSString *string1 = @"laoWang";
NSString *string2 = @"yaLi";
NSComparisonResult result = [string1 compare:string2];
NSLog(@"%ld",result);
switch (result){
case NSOrderedAscending:
NSLog(@"前小后大");
break;
case NSOrderedDescending:
NSLog(@"前大后小");
break;
default:
NSLog(@"相等");
break;
}
6.獲取子字符串
NSString *string = @"lanOuDalian";
獲取下標(biāo)為5之前的字符.(不包含5)
NSString *string1 = [string substringToIndex:5];
NSLog(@"%@",string1);
截取下標(biāo)為5之后的字符(包含5).
NSString *string2 = [string substringFromIndex:5];
NSLog(@"%@",string2);
截取從下標(biāo)3開始長度為4的字符.
NSString *string3 = [string substringWithRange:NSMakeRange(3, 4)];
NSLog(@"%@",string3);
7.字符串拼接
NSString *string = @"大連";
NSString *string2 = [string stringByAppendingString:@"藍(lán)歐"];
NSLog(@"%@",string2);
NSString *string3 = [string2 stringByAppendingFormat:@"%d",1233];
NSLog(@"%@",string3);
8.字符串替換
NSString *string = @"lanoudalian";
前面的a是我想要替換的字符串后面的b是我想要替換成的字符串,
NSString *string2 = [string stringByReplacingOccurrencesOfString:@"a" withString:@"b"];
NSLog(@"%@",string2);
9.字符串類型轉(zhuǎn)換成其他類型
NSString *string1 = @"123";
將字符串轉(zhuǎn)換成長整形
NSInteger a = [string1 integerValue];
NSLog(@"%ld",a);
NSString *string2 = @"18.9";
float b = [string2 floatValue];
NSLog(@"%f",b);
NSString *string3 = @"18";
int c = [string3 intValue];
NSLog(@"%d",c);
10.大小寫轉(zhuǎn)換
NSString *string = @"hello lanou";
(1)全部大寫
NSString *upperString = [string uppercaseString];
NSLog(@"%@",upperString);
(2)全部小寫
NSString *lowerStr = [string lowercaseString];
NSLog(@"%@",lowerStr);
(3)首字母大寫
NSString *capitalStr =[string capitalizedString];
NSLog(@"%@",capitalStr);
11.判斷開頭結(jié)尾
NSString *string = @"http://www.lanou3g.com";
判斷是否以http開頭
BOOL isPrefix = [string hasPrefix:@"http"];
NSLog(@"%d",isPrefix);
12.插入字符串
[mStrinsertString:@"haha"atIndex:0];
NSLog(@"%@",mStr);
13.刪除字符串
[mStrdeleteCharactersInRange:NSMakeRange(3,2)];
NSLog(@"%@",mStr);
14.替換字符串
[mStrreplaceCharactersInRange:NSMakeRange(3,2)withString:@"123"];
NSLog(@"%@",mStr);
15.重置字符串
[mStrsetString:@"heihei"];
NSLog(@"%@",mStr);
五.數(shù)組
系統(tǒng)提供的數(shù)組類:類似于c語言里的數(shù)組的功能
2.數(shù)組是一個(gè)大容器,數(shù)組里可以存儲(chǔ)不同類型的對象,但必須要保證數(shù)組里存儲(chǔ)的都是對象,
3.oc里提供了兩類數(shù)組:一類是NSArray(不可變數(shù)組),一類是NSMutableArray(可變數(shù)組)
可變與不可變的區(qū)別;可變就意味著可以對原對象進(jìn)行操作,不可變就意味著一旦創(chuàng)建,內(nèi)容就不可變.
(1)使用初始化方法創(chuàng)建數(shù)組
NSArray *array1 = [[NSArray alloc]initWithObjects:@"徐冶",@"徐寶寶",@"冶寶寶",@"徐冶寶寶", nil];
NSLog(@"%@",array1);//(%@)對象類型的占位符
(2)使用便利構(gòu)造器方法創(chuàng)建數(shù)組(最常用的方法)
NSArray *array = [NSArray arrayWithObjects:@"xuYe",@"xuBaoBao",@"yeBaoBao",@"xuYeBaoBao" ,nil];
NSLog(@"%@",array);
NSArray *haha = [NSArray arrayWithObjects:@"doubi",@"nihao", nil];
NSLog(@"%@",haha);
(3)字面量
NSArray *array = @[@"xuYe",@"haha",@"doubi",@"nihao"];
NSLog(@"%@",array);
4.數(shù)組元素的個(gè)數(shù)
NSUInteger count = array.count;
NSLog(@"%lu",count);
5.獲取數(shù)組元素
NSString *name1 = [array objectAtIndex:0];
NSLog(@"%@",name1);
字面量取法
NSString *name2 = array[2];
NSLog(@"%@",name2);
NSString *name3 = [array firstObject];
NSLog(@"%@",name3);
NSLog(@"first = %@",name3);
NSString *name4 = [array lastObject];
NSLog(@"%@",name4);
6.當(dāng)數(shù)組為空的時(shí)候,使用firstObject以及l(fā)astObject可以保證程序安全,不會(huì)崩潰,返回值是nil,但使用objectAtIndex:時(shí),如果數(shù)組為空,則程序崩潰(不知道數(shù)組是否為0,用first或者last或者.count判斷)
NSArray *nameArrayOne = [NSArray arrayWithObjects:@"Xuye",@"haha",@"haha",@"heieh", nil];
NSArray *nameArrayTwo = [NSArray arrayWithObjects:@"xiaoYaLi",@"daYaLi",@"yaLiBaoBao",@"xiaoYaLiBaoBao", nil];
7.查找haha對應(yīng)的下標(biāo)
NSUInteger index = [nameArrayOne indexOfObject:@"haha"];
NSLog(@"%lu",index);
8.斷數(shù)組中是否包含某個(gè)對象(還可以判斷是否收藏過,或者閱讀過)
BOOL isTrue = [nameArrayOne containsObject:@"haha"];
NSLog(@"isTrue == %d",isTrue);
9.判斷兩個(gè)數(shù)組是否相等
BOOL isEqual = [nameArrayOne isEqualToArray:nameArrayTwo];
NSLog(@"isEqual == %d",isEqual);
NSString *string1 = @"123";
NSString *string2 = @"321";
if ([string1 isEqualToString:string2]){
NSLog(@"相等");
}else{
NSLog(@"不等");
}
NSArray和NSString之間的轉(zhuǎn)換
NSString *string = @"www.lanou3g.com";(字符串到數(shù)組)
NSArray *array = [string componentsSeparatedByString:@"."];
NSLog(@"%@",array);
10.數(shù)組到字符串
NSArray *myArray = [NSArray arrayWithObjects:@"北京",@"大連",@"上海",@"廣東",@"鄭州",nil];
NSString *myString = [myArray componentsJoinedByString:@"&"];
NSLog(@"%@",myString);
11.Capacity容量
以下三種方式都是創(chuàng)建一個(gè)可變的空數(shù)組
NSMutableArray *myArray = [[NSMutableArray alloc]initWithCapacity:1];//(如果給1用完之后在開辟1個(gè)對象空間,如果給10用完之后再給10個(gè)對象空間如果給20用完空間之后再給開辟20個(gè)對象空間......以此類推);
NSMutableArray *youArray = [NSMutableArray arrayWithCapacity:1];
NSMutableArray *bigArray = [NSMutableArray array];//創(chuàng)建空數(shù)組
12.增加數(shù)據(jù)
addObject? :在數(shù)組的最后面添加
[bigArray addObject:@"lanou"];
[bigArray addObject:@"dalian"];
[bigArray addObject:@"beijing"];
[bigArray addObject:@"beijing"];
NSLog(@"%@",bigArray);
13.在指定位置插入一個(gè)元素
[bigArray insertObject:@"heihei" atIndex:1];//(insert:插入,嵌入)
NSLog(@"%@",bigArray);
14.刪除
(1).刪除指定元素(只要是這個(gè)對象有多少刪多少)
[bigArray removeObject:@"beijing"];
NSLog(@"%@",bigArray);
[bigArray removeObjectAtIndex:0];
NSLog(@"%@",bigArray);
(2).替換元素
[bigArray replaceObjectAtIndex:1 withObject:@"beijing"];
NSLog(@"%@",bigArray);
(3).交換指定位置的兩個(gè)元素
[bigArray exchangeObjectAtIndex:0 withObjectAtIndex:1];
NSLog(@"%@",bigArray);
(4).刪除全部
[bigArray removeAllObjects];
NSLog(@"%@",bigArray);
六、字典
1.字典具有一一對應(yīng)的數(shù)據(jù)氯葬,它是無序的挡篓,取出的key和value是有序的,字典里的數(shù)據(jù)成對出現(xiàn)帚称,值可以相同官研,但是key不可以相同,一個(gè)key一個(gè)value闯睹。
2.便利構(gòu)造器方法
NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"xiaoyali",@"name",@"nan",@"sex", nil];
NSLog(@"%@",dic);
NSDictionary *dic2 = @{@"name":@"xiaoyali",@"sex":@"nan"};
NSLog(@"%@",dic2);
3.求字典的元素個(gè)數(shù)
NSUInteger count = dic2.count;
NSLog(@"%lu",count);
4.將字典里所有的value放到一個(gè)數(shù)組里**********
NSArray *values = dic2.allValues;
NSLog(@"%@",values);
5.字典取值
NSString *name = [dic2 objectForKey:@"name"];
NSLog(@"%@",name);
NSString *sex = [dic2 objectForKey:@"sex"];
NSLog(@"%@",sex);
BOOL a = dic2.allKeys;
可變字典
NSMutableDictionary *dic = [[NSMutableDictionary alloc]initWithObjectsAndKeys:@"zhangsan",@"name",@"nan",@"sex", nil];
6.字典增加一個(gè)元素
[dic setObject:@"18" forKey:@"age"];
NSLog(@"%@",dic);
[dic setObject:@"jinzhou" forKey:@"city"];
NSLog(@"%@",dic);
7.修改名字為xiaoyali
[dic setObject:@"xiaoyali" forKey:@"name"];
NSLog(@"%@",dic);
8.setObject:forKey:工作原理:先查找字典里有沒有對應(yīng)key,如果有,則修改key對應(yīng)的value,如果沒有把key-value作為元素添加到字典里
[dic setObject:@"dalian" forKey:@"city"];
NSLog(@"%@",dic);
9.移除元素
[dic removeObjectForKey:@"city"];
NSLog(@"%@",dic);
10.移除所有元素
[dic removeAllObjects];
NSLog(@"%@",dic);
11.數(shù)組套數(shù)組
NSMutableArray *array1 = [NSMutableArray arrayWithObjects:@"11",@"222", nil];
NSMutableArray *array2 = [NSMutableArray arrayWithObjects:@"22",@"333",@"1234", nil];
NSMutableArray *array = [NSMutableArray array];
[array addObject:array1];
[array addObject:array2];
NSLog(@"%@",array);
12.便利構(gòu)造器方法
NSMutableDictionary *dic1 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"zhangsan",@"name",nil];
NSMutableDictionary *dic2 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"lisi",@"name",nil];
[array addObject:dic1];
[array addObject:dic2];
NSLog(@"%@",array);
NSMutableDictionary *dic3 = array[3];
NSLog(@"%@",dic3);
創(chuàng)建一個(gè)空字典
NSMutableDictionary *myDic = [NSMutableDictionary dictionary];
[myDic setObject:array1 forKey:@"one"];
[myDic setObject:array2 forKey:@"two"];
NSLog(@"%@",myDic);
[myDic setObject:dic1 forKey:@"three"];
[myDic setObject:dic2 forKey:@"four"];
NSLog(@"%@",myDic);
七戏羽、集合
1.特點(diǎn):無序性,互異性,本質(zhì)上是一個(gè)大容器
NSSet *mySet = [[NSSet alloc]initWithObjects:@"aa",@"bb",@"cc",@"dd",@"aa",@"bb",@"bb",@"cc", nil];
NSLog(@"%@",mySet);
2.元素的個(gè)數(shù)
NSUInteger count = mySet.count;
NSLog(@"%lu",count);
3.獲取集合里的元素
NSString *string1 = [mySet anyObject];
NSLog(@"%@",string1);
4.將集合里的元素取到一個(gè)數(shù)組里
NSArray *myArray = mySet.allObjects;
NSLog(@"%@",myArray);
可變集合
NSMutableSet *mySet = [[NSMutableSet alloc]initWithObjects:@"aa",@"bb", nil];
5.添加元素
[mySet addObject:@"cc"];
[mySet addObject:@"bb"];
NSLog(@"%@",mySet);
NSLog(@"%lu",[mySet count]);
6.移除元素
[mySet removeObject:@"aa"];
NSLog(@"%@",mySet);
八、內(nèi)存管理
1.為什么本該引用計(jì)數(shù)為0的,為什么還是1,引用計(jì)數(shù)只是告訴系統(tǒng)是否需要回收空間,當(dāng)最后一次release的時(shí)候,發(fā)現(xiàn)計(jì)數(shù)為1,就說明只有自己在使用,所以自己release之后直接回收空間即可,無需再將引用計(jì)數(shù)置0
2.過度釋放
Person *per = [[Person alloc]init];
[per release];
[per release];
3.野指針
Person *per = [[Person alloc]init];
per.name= @"冶寶寶";
Person *per2 = per;
[per release];
NSLog(@"%@",per2.name);
4.內(nèi)存泄露
Person *per1 = [[Person alloc]init];
Person *per2 = [[Person alloc]init];
per2 = per1;
NSString *string = @"lanou";
[string release];
[string release];
NSLog(r@"%lu",[string retainCount]);
5.滿足什么條件才會(huì)引用計(jì)數(shù)的概念
(1).必須是oc的對象
(2).空間必須在堆區(qū)
(3).其他區(qū)的引用計(jì)數(shù)都是一個(gè)無限大的數(shù)
Person *per = [[Person alloc]initWithName:@"123"];
[per release];
6. copy
根據(jù)copyWithZone:方法的實(shí)現(xiàn)不同,拷貝分為三種類型:偽拷貝
淺拷貝深拷貝