1. NSString前面NS是NextSTEP的縮寫(xiě).
2.面向?qū)ο缶幊蘋(píng)OP (ObjectOrientedProgramming)
3.接口在程序里叫數(shù)據(jù)接口
在網(wǎng)絡(luò)里叫網(wǎng)絡(luò)接口
4.成員可見(jiàn)度定義:
@public大家的
@product受保護(hù)的
@private私有的
5.接口部分標(biāo)志@interface@end一對(duì)
6.所有@的符號(hào)都是OC對(duì)C語(yǔ)言擴(kuò)展的東西
7.
-(void)sayHi; -號(hào)代表實(shí)例方法.void是返回值類(lèi)型.
+類(lèi)方法.
8.
-號(hào)方法必須由實(shí)例對(duì)象來(lái)調(diào)用,+號(hào)方法必須由類(lèi)來(lái)直接調(diào)用
9.NSLog=printfNSLog是C語(yǔ)言的函數(shù)
10.NSLog(@“sdfsdfsdf”);@后面叫字符串對(duì)象. %@替換對(duì)象的(替換進(jìn)去的肯定是文字信息)
112015-01-22 16:32:33.758 HelloOC[618:303]HELLO, WORLD
618是進(jìn)程號(hào),303線程號(hào)
12.
類(lèi)名大寫(xiě)開(kāi)頭
方法名和變量小寫(xiě)開(kāi)頭
13 #import導(dǎo)入oc基礎(chǔ)庫(kù)
14具有相同特征和行為的事物的抽象.類(lèi)的定義
15所有的類(lèi)都放在了全局區(qū)
alloc是把在全局去里的成員變量拷貝到堆里面一份
alloc所有的成員變量都有初值
16 void *p無(wú)類(lèi)型指針
17id是typedefvoid *id叫泛型指針id可以保存任何類(lèi)型的指針.
17不能簡(jiǎn)單的改變2個(gè)變量的值,而作用域約束
如果想在外部去修改2個(gè)局部變量的值,必須拿到地址.
18->指向標(biāo)示符
19父類(lèi):總類(lèi)子類(lèi):分類(lèi)的概念.而不是父親和兒子的概念(不是具體的實(shí)物)!
20給對(duì)象聲明空間的時(shí)候就賦初值
Person.h中:
@interface Person :NSObject
{
@public//如果下面沒(méi)給值,系統(tǒng)會(huì)自動(dòng)初始化.
NSString *_name;
NSString *_gender;
NSString *_hobby;
NSString *_hobby1;
int _age;
}
- (id)init1;
@end
Person.m中:
- (id)init1
{
_age = 18;
_name = @"HAHAHA";
return self;
}
main.m中:
Person *p =[[Person alloc] init1];
[p eat];
可見(jiàn)度是約束(標(biāo)示符)的訪問(wèn)權(quán)限,指的是標(biāo)示符符號(hào)的訪問(wèn)權(quán).
21
@public子類(lèi)可見(jiàn),外部也可見(jiàn)
@protected子類(lèi)可見(jiàn),外部不可見(jiàn)
@private子類(lèi)不可見(jiàn)(不允許訪問(wèn)),外部類(lèi)不可見(jiàn)
子類(lèi)可以繼承父類(lèi)的private后的屬性,但是不能訪問(wèn).
private不光要保護(hù)內(nèi)部數(shù)據(jù)的安全,也要保護(hù)外部能安全的使用.
22.在當(dāng)前類(lèi)中不允許方法名重復(fù),在別的類(lèi)可以定義一個(gè)跟這個(gè)方法同名的方法.
-(id)initWithName:(NSString *)name;init開(kāi)頭是對(duì)創(chuàng)建對(duì)象和初始化的,不要隨便寫(xiě)類(lèi)名字開(kāi)頭.如果init不是初始化的方法,Xcode會(huì)拒絕編譯.
初始化方法init只能調(diào)用一次.不能重復(fù)調(diào)用
- (void)setName:(NSString*)name setGender:(NSString *)gender
{
_name = name;
_gender = gender;
}
但是不能同時(shí)get2個(gè)屬性例如:
- (NSString*)getName: (NSString *)getGender
{
return self;
}這樣是錯(cuò)誤的
如果不小心修改了Xcode的系統(tǒng)文件.
找到錯(cuò)誤提示路徑,刪除里面所有東西,之后再Xcode中Product中選擇clean然后在重新編譯.
不能在main里面用super因?yàn)閙ain類(lèi)沒(méi)有父類(lèi).
對(duì)super發(fā)消息就是一個(gè)途徑,指向的從父類(lèi)繼承的方法.
構(gòu)造器用來(lái)創(chuàng)建對(duì)象的
重點(diǎn):指派構(gòu)造designated
initializer指派初始化方法.
(某個(gè)方法里面有super init那么這個(gè)方法就是指派構(gòu)造化方法.(也是初始化入口)(也叫默認(rèn)指派初始化方法)
類(lèi)里面必須得有這么唯一一個(gè)指派初始化方法的入口
-(id)initWithName:(NSString *)name
sex:(NSString *)sex
hobby:(NSString *)hobby
{
//self = [super init];
//if (self) {
//_name = name;
//_sex = sex;
//_hobby = hobby;
//}
//return self;
self = [self initWithName:name sex:sexhobby:hobby age:0];
return self;
}
指派初始化方法:
- (id)init
{
//self = [super init];
////如果self是有效指針(非空)
//if (self) {
//_name = @"小唐";
//_sex = @"男";
//_age = 40;
//}
self = [self initWithName:nil sex:nilhobby:nil age:0];
return self;
}
- (id)initWithName:(NSString*)name
{
self = [self initWithName:name sex:nil];
return self;
}
-(id)initWithName:(NSString *)name
sex:(NSString *)sex
{
self = [self initWithName:name sex:sexhobby:nil];
return self;
}
- (id)initWithName:(NSString*)name
sex:(NSString *)sex
hobby:(NSString *)hobby
{
self = [self initWithName:name sex:sexhobby:hobby age:0];
return self;
}
-(id)initWithName:(NSString *)name
sex:(NSString *)sex
hobby:(NSString *)hobby
age:(NSInteger)age
{
self = [super init];
if (self) {
_name = name;
_sex = sex;
_hobby = hobby;
_age = age;
}
return self;
}
dealloc(銷(xiāo)毀)不允許手動(dòng)調(diào)用,系統(tǒng)自動(dòng)調(diào)用
MRC manual
reference count手動(dòng)引用計(jì)數(shù)
ARCauto reference count系統(tǒng)自動(dòng)掃描添加釋放內(nèi)存.
-release()是引用計(jì)數(shù)器減1
-autorelease()自動(dòng)釋放池.
-retain(引用,不會(huì)產(chǎn)生新的對(duì)象)對(duì)這個(gè)對(duì)象發(fā)送這個(gè)消息,引用計(jì)數(shù)器+1
[sturetainCount]輸出引用計(jì)數(shù)器的值
怎么把Xcode改成MRC
左鍵項(xiàng)目,然后搜matic找到objective-c
automatic reference counting改成no
alloc和retain的數(shù)量要等于release
便利構(gòu)造器:
+
(id)personWithName:(NSString *)name//+開(kāi)頭,類(lèi)名開(kāi)頭,返回的是id就是便利構(gòu)造器
{
Person *person = [[Person alloc]initWithName:name];
return [person autorelease];
}
autorelease自動(dòng)釋放池,什么時(shí)候釋放,是由系統(tǒng)控制的
//為什么釋放之后還是能打出來(lái)1:
Person *per = [PersonpersonWithName:@"小唐"];
NSLog(@"%lu",[per retainCount]);
[per release];
NSLog(@"%lu",[perretainCount]);//這個(gè)是野指針,雖然對(duì)象被釋放了,但是內(nèi)存那塊沒(méi)被覆蓋,所以才能打出來(lái)1.
系統(tǒng)為了做優(yōu)化,所以當(dāng)retainCount為1的時(shí)候直接銷(xiāo)毀,不用再去—了.
- (void)release
{
if (1== self.retainCount) {
[self dealloc];
}
else {
self.retainCount--;
}
}
autorelease引用計(jì)數(shù)器延遲減1
成員變量是隨著對(duì)象消亡而消亡對(duì)象的消亡是在dealloc中,每個(gè)成員變量要在dealloc這釋放.
棧里面的東西是隨著函數(shù)的退出而消亡
當(dāng)指針變量聲明周期結(jié)束前要release
settergetter方法,和便利構(gòu)造器補(bǔ)全.
父對(duì)象要保證子對(duì)象在父對(duì)象的生命周期是安全的
比如myclass是父對(duì)象(_student這個(gè)指針指向的那個(gè)student就是子對(duì)象),里面有個(gè)Student*student這個(gè)student是子對(duì)象.(因?yàn)閟tudent是個(gè)指針也是個(gè)對(duì)象)
如何保證父對(duì)象里的子對(duì)象安全,對(duì)子對(duì)象retain.
為什么不能手動(dòng)寫(xiě)dealloc因?yàn)榭赡苓€有別人在用,釋放了的話就crash了
在.h中容易產(chǎn)生交叉導(dǎo)入,容易產(chǎn)生符號(hào)找不著的問(wèn)題.
而真正的頭文件要在.m中導(dǎo)入.
父對(duì)象一定會(huì)強(qiáng)引用自己的子對(duì)象.(強(qiáng)引用,就是對(duì)引用計(jì)數(shù)器+1)
self是內(nèi)部指向這個(gè)類(lèi)的指針,stu是外部的指針
atomic(原子)原子化效率低,安全
一個(gè)類(lèi)可以寫(xiě)在不同的原文件中.(類(lèi)目)
只能添加方法,不能添加成員變量.
@interface NSString(SayHi)給NSString添加一個(gè)SayHi
方法.
當(dāng)兩個(gè)對(duì)象都同時(shí)要使用同一個(gè)字符串的時(shí)候,這個(gè)字符串類(lèi)型要用NSMutableString
指針類(lèi)型的作用:
1.做算術(shù)運(yùn)算跳數(shù)的大小
2.間接尋址指向的類(lèi)型.
NSString *p方便編譯器去檢查錯(cuò)誤(為什么加指針?lè)?hào)
如果想讓類(lèi)目訪問(wèn)成員變量,必須在主類(lèi)里顯示聲明.
isEqualToString比較兩個(gè)字符串對(duì)象是否相等\
怎么把數(shù)字轉(zhuǎn)換成字符串.
OC的數(shù)組會(huì)對(duì)每一個(gè)加進(jìn)去的對(duì)象,引用計(jì)數(shù)器都會(huì)+1,然后釋放的時(shí)候,會(huì)自動(dòng)減1.
//其實(shí)自動(dòng)釋放池里就有一個(gè)數(shù)組
self只能初始化才能賦值,以后就不能變了.
字典存取不是連續(xù)的,是散列的,根據(jù)key所計(jì)算的下表(哈希算法)
字典以空指針結(jié)束.所以不能存空指針
//71 72 74
//26 27 30 313237
(集合)set無(wú)序集合.直接給一個(gè)對(duì)象,自動(dòng)算hash.(當(dāng)你需要知道一個(gè)對(duì)象是否在集合中) (集合和數(shù)組和對(duì)象不同,不能存重復(fù)對(duì)象)
假設(shè)hash重復(fù)了,就順延往下存,第二種就是往上跳10個(gè).
第三種,做小集合,如果在這個(gè)小集合找到重復(fù)的了,就去另一個(gè)小集合找.
netsh winsock reset
super只能幫我們找到這個(gè)類(lèi)從父類(lèi)繼承過(guò)來(lái)的方法.
指針聲明周期結(jié)束之前要對(duì)它relase
局部變量在消亡時(shí)釋放?
成員變量在函數(shù)return時(shí)釋放?
id是泛型指針,(可以保存任意類(lèi)型的指針)
添加到數(shù)組中得元素都會(huì)retain
遍歷構(gòu)造器的好處:
1.工廠方法,工廠生產(chǎn)
2.我們不用關(guān)系它的釋放,因?yàn)榉祷鼗貋?lái)的就是臨時(shí)對(duì)象!
加完斷點(diǎn)之后,在lldb中輸入po province打印這個(gè)對(duì)象.
子對(duì)象強(qiáng)引用父對(duì)象,形成內(nèi)存空洞.都互相對(duì)對(duì)方引用計(jì)數(shù)器+ 1
嵌套引用(2個(gè)對(duì)象無(wú)法釋放)
類(lèi)目
不能增加成員變量.(如果在類(lèi)目中添加屬性,只有方法,沒(méi)有對(duì)應(yīng)的成員變量).(類(lèi)目不能訪問(wèn)屬性創(chuàng)建的成員變量)
分類(lèi)管理類(lèi)
寫(xiě)在不同的原文件中
額外添加相應(yīng)方法
時(shí)間戳(1970年開(kāi)始計(jì)算秒數(shù)):因?yàn)?970年Unix
NSDate存得的是標(biāo)準(zhǔn)時(shí)間,沒(méi)有時(shí)差.
//NSTimeZone *zone = [NSTimeZonetimeZoneWithName:@"America/Swift_Current"];
//[nmatter setTimeZone:zone];
//NSDate *sDate = [nmatterdateFromString:dateString];
//NSLog(@"%@", sDate);
OC的類(lèi)目是為了防止java的過(guò)度繼承
OC中寫(xiě)入延展是對(duì)類(lèi)內(nèi)部開(kāi)放的,不讓外面類(lèi)訪問(wèn)(也就是java中得私有方法.)
有效的封裝不只是保證內(nèi)部安全,還保障外部安全.
接口是對(duì)外服務(wù)的菜單
私有API方法是在延展里的,沒(méi)有在.h中聲明的
協(xié)議里的可選方法,(首先要確定這個(gè)方法實(shí)現(xiàn)了)
一個(gè)類(lèi)可以遵守多個(gè)協(xié)議(協(xié)議是可以繼承的)
代理指針為什么用assign,不允許用retain為了防止父對(duì)象做子對(duì)象的代理時(shí)候,產(chǎn)生的循環(huán)應(yīng)用.
(延展):把外面不需要的功能,放在類(lèi)里面(高內(nèi)聚)
(協(xié)議):每個(gè)類(lèi)單獨(dú)管理,而不是兩個(gè)類(lèi)互相有聯(lián)系(低耦合)
//alloc, copy, init產(chǎn)生的對(duì)象不需要釋放.(這3個(gè)單詞不能做字頭)
淺拷貝:父對(duì)象是同一個(gè),子對(duì)象是不同的
深拷貝:父對(duì)象和子對(duì)象是不同的2對(duì)
父類(lèi)指針指向了子類(lèi)對(duì)象(多態(tài)) (目的:寫(xiě)通用代碼);
setter和getter里面寫(xiě)得先得判斷傳進(jìn)來(lái)是不是以前的.
block就是一段代碼段,(訪問(wèn)得用指針訪問(wèn)) block就是一個(gè)對(duì)象,可以retain和copy