1.項(xiàng)目經(jīng)驗(yàn)
2.基礎(chǔ)問題
3.指南認(rèn)識(shí)
4.解決思路
ios開發(fā)三大塊:
1.Oc基礎(chǔ)
2.CocoaTouch框架
3.Xcode使用
--------------------
CocoaTouch
Media
Core Services
Core OS
--------------------
System Framework
OC的類聲明,定義域
OC關(guān)鍵字定義為@class
O-C特有的語句for(掐场。焙畔。in?酸员。。)迭代循環(huán)讳窟,其他的條件和循環(huán)語句和c一樣
OC對面向?qū)ο蟮母攀?/b>
(1)基類:NSOject
(2)一般的繼承是單繼承漾月,使用協(xié)議@protocol?實(shí)現(xiàn)多重繼承
(3)所有的函數(shù)都是虛函數(shù)
Id類型
OC中每個(gè)目標(biāo)都可以表達(dá)為id類型团赏,泛型〉榛瑁可以認(rèn)為是NSObject *或者voidNil
等同于null顽分,表示一個(gè)目標(biāo)指針
類定義
Oc的類分為2個(gè)文件染突,
.h文件存放類泌射,函數(shù)的聲明(聲明的關(guān)鍵字@interfance???@end)
.m文件存放類的具體實(shí)現(xiàn)(實(shí)現(xiàn)關(guān)鍵字)
對象和類的方法
“+”?表示類的方法
“-”表示對象的方法-(int)返回值f?函數(shù)的名字: (int)??x;參數(shù)(有個(gè)“:”表示有幾個(gè)參數(shù)瘩缆,從第二個(gè)參數(shù)起“:”前面必須加空格)
對于方法聲明的講解
“:”表示繼承@interface??Dog : NSObject{}??@end
“{}”之間只能寫字段(如:int age)但校,不能寫函數(shù)
右括號(hào)和@end間接寫的是函數(shù)
創(chuàng)建對象
Dog *dog=[Dog?alloc] ;??一個(gè)類的名字+ alloc
初始化構(gòu)造函數(shù)
[dog?init];凡是以init…開頭的都是構(gòu)造函數(shù)
銷毀對象
[dog release];
字段定義
三種作用域:@public @protected(保護(hù)钧大,在類本身或者子類中)@private?(只能在類的內(nèi)部)
補(bǔ)充:缺省的是protected
函數(shù)全部用public
變量必須定義在類{}之間的地方
注:在c中函數(shù)和字段是可以重名的
類的聲明
必須帶“*”?即表示指針也表示引用Dog(對象)* myDog?(變量名)
訪問myDog.dog(變量名訪問字段)或者使用空格
多參數(shù)方法
帶兩個(gè)參數(shù)(函數(shù)名為f::)
兩種寫法-(float)f(int)x?【空格】:(int)y???????????不提倡這種寫法
(2)-(float)f(int)x??【空格】g:(int)y??g:表示標(biāo)簽(第一參數(shù)不能有標(biāo)簽,第一個(gè)函數(shù)名就相當(dāng)于第一個(gè)參數(shù)的標(biāo)簽宜咒,是為了方便閱讀)
如何調(diào)用方法
無參數(shù)
-(int)foo;
Int ret=[obj foo]?調(diào)obj的方法幌绍,沒有參數(shù),調(diào)方法的時(shí)候用[]
一個(gè)參數(shù)
-(int)foo:(int)a;
Int ret=[obj foo:10]
帶標(biāo)簽
-(int)foo:(int)a???andB(int)b;
Int ret=[obj foo:10??andB:2];
OC不是嚴(yán)格的函數(shù)重載
-(int)g:(int)x;
-(int)g:(folat)x;兩個(gè)函數(shù)的函數(shù)名都為”g:”?在OC中是錯(cuò)誤的趾牧,但是c中是可行
函數(shù)作用域聲明
.h中定義的所有函數(shù)都是public類型的
私有化的解決方法
在.m文件中使用Categories
@propertyage
合成定義在.h文件中使用編譯器
=(1)”-(void)setAge:(int)newAge;” + “-(int) age;”
@synthesize合成實(shí)現(xiàn)检盼,編譯器自動(dòng)實(shí)現(xiàn)getter和setter函數(shù)
=(1)”-(void)setAge:(int)newAge{ age = newAge;}”+”return age;”
屬性可以是
readwrite(缺省)翘单,readonl:
表示可讀寫(setter和getter函數(shù)都可以使用)吨枉,readonly只能用getter
assign(缺省)哄芜、retain貌亭,copy
表示屬性如何存儲(chǔ)assign相當(dāng)于“=”表示賦值
Nonatomic(UI中常用)
表示不用考慮線程安全問題
getter=…,setter=…
重新設(shè)置getter函數(shù)和setter函數(shù)名
點(diǎn)語法
內(nèi)部類age和點(diǎn)age(.age)不同
直接訪問age相當(dāng)于訪問age字段,
.age在等號(hào)左邊相當(dāng)于setter函數(shù)认臊,在等號(hào)的右邊相當(dāng)于getter函數(shù)
例子:dog.age=200圃庭;展開成[dog setAge:200];
說明:
(1)age不是變量的名字,而是函數(shù)
(2)點(diǎn)語法在等號(hào)的左邊表示設(shè)置函數(shù)(set…)
dogAge = dog.age;展開成dogAge = [dog age];??(系統(tǒng)自動(dòng)展開)
@class?與?#import :
import會(huì)包含這個(gè)類的所有信息美尸,包括實(shí)體變量和方法冤议,
而@class只是告訴編譯器,其后面聲明的名稱是類的名稱
在頭文件中师坎, 一般只需要知道被引用的類的名稱就可以了恕酸。 不需要知道其內(nèi)部的實(shí)體變量和方法,
所以在頭文件中一般使用@class來聲明這個(gè)名稱是類的名稱胯陋。
而在實(shí)現(xiàn)類里面蕊温,因?yàn)闀?huì)用到這個(gè)引用類的內(nèi)部的實(shí)體變量和方法,
所以需要使用#import來包含這個(gè)被引用類的頭文件遏乔。
在編譯效率方面考慮义矛,如果你有100個(gè)頭文件都#import了同一個(gè)頭文件,或者這些文件是依次引用的盟萨,
如A–>B, B–>C, C–>D這樣的引用關(guān)系凉翻。當(dāng)最開始的那個(gè)頭文件有變化的話,后面所有引用它的類都需要重新編譯捻激,
如果你的類有很多的話制轰,這將耗費(fèi)大量的時(shí)間。而是用@class則不會(huì)胞谭。
如果有循環(huán)依賴關(guān)系垃杖,如:A–>B, B–>A這樣的相互依賴關(guān)系,如果使用#import來相互包含丈屹,那么就會(huì)出現(xiàn)編譯錯(cuò)誤调俘,
如果使用@class在兩個(gè)類的頭文件中相互聲明,則不會(huì)有編譯錯(cuò)誤出現(xiàn)。
所以彩库,一般來說肤无,@class是放在interface中的,只是為了在interface中引用這個(gè)類侧巨,把這個(gè)類作為一個(gè)類型來用的舅锄。
在實(shí)現(xiàn)這個(gè)接口的實(shí)現(xiàn)類中,如果需要引用這個(gè)類的實(shí)體變量或者方法之類的,還是需要import在@class中聲明的類進(jìn)來.
字符串
NSString:Cocoa中處理字符串的類
NSString型數(shù)據(jù)是特殊的NSString字面量司忱,其指示標(biāo)志是雙引號(hào)內(nèi)的字符串前的@皇忿,如@“Hi!”
NSString的stringWithFormat:方法就是通過格式字符串和參數(shù)來創(chuàng)建NSString的
+(id)stringWithFormat:(NSString *)format坦仍,...;
例子:
NSString *height鳍烁;
Height=[NSString stringWithFormat:@”Your height is %d feet,%d inches”,5,11];
stringWithForat:(1)定義最后的省略號(hào):可以接受對個(gè)以逗號(hào)隔開的其他參數(shù)
(2)“+”修飾的方法,為類方法繁扎,這個(gè)方法屬于類對象(而不是類的實(shí)例對象)并且通常用于創(chuàng)建新的實(shí)例
是一個(gè)工廠方法幔荒,根據(jù)提供的參數(shù)創(chuàng)建新對象
“-”創(chuàng)建的大部分方法都是實(shí)例方法
NSString的實(shí)例方法length。返回的是字符串中的字符個(gè)數(shù)
使用-(unsigned int)length:
Unsigned int length=[height length]梳玫;
If([height length]>35){
NSLog(@”wow,you’re relly??tall!”)}
比較字符串
isEqualToString:可以用來比較接收方和當(dāng)做參數(shù)傳遞來的字符串爹梁。返回一個(gè)BOOL型數(shù)據(jù)表示字符串的內(nèi)容是否相同,
-(BOOL)isEqualToString:(NSString *)aString提澎;
具體的使用方法:
NSString *thing1=@“hello 5”姚垃;
NSString *thing2;
Thing2=[NSString stringWithFormat:@“hello %d”,5];
If([thing1 isEqualToString:thing2]){ NSLog(@”They are??the same!);
注意:“==“運(yùn)算符只判斷thing1和thing2的這真數(shù)值,而不是他們所指的對象
兩個(gè)字符串是否相等(等價(jià)性盼忌,兩個(gè)字符串是否代表同一個(gè)事物)用isEqualToString
Compare:(區(qū)分大小寫的比較的字符逐個(gè)字符的進(jìn)行比較积糯,,返回一個(gè)NSComparisonResult(就是一個(gè)enum型數(shù)據(jù))來顯示比較結(jié)果谦纱。如返回值是NSOrderedAscending看成,那么左側(cè)的數(shù)值就小右側(cè)的數(shù)值,即compare的目標(biāo)在字母表中的排序位置比傳遞進(jìn)來的字符串更靠前
Compare:options:
例子:-(NScomparisonResult)compare:(NSString *)string
options:(unsigned)mask跨嘉;
options參數(shù)是一個(gè)位掩碼川慌。可以使用位或(bitiwise-OR)運(yùn)算符(|)來添加選項(xiàng)標(biāo)記祠乃。常用的選項(xiàng)如下:
NSCaseInsensitiveSearch:不區(qū)分大小寫字符
NSLiteralSearch:進(jìn)行完全比較窘游,區(qū)分大小寫
NSNumericSearch:比較字符串的字符個(gè)數(shù),而不是字符值跳纳,
可變數(shù)組
與NSString一樣NSArray創(chuàng)建的是不可變對象的數(shù)組。補(bǔ)充類NSMutableArray贪嫂,可以隨意的田間和刪除數(shù)組寺庄,通過類方法arrayWithCapacity來創(chuàng)建新的可變數(shù)組
+(id)arrayWithCapacity:(unsignde)numltems
刪除特定索引處德對象。removeObject
枚舉
NSEnumerator是Cocoa用來描述集合迭代運(yùn)算的方式,需通過objectEnumerator像組組請求枚舉器
-(NSEnumerator *)objcetEnumerator
從后向前瀏覽集合reverseObjectEnumerator
可以用while循環(huán)斗塘,每次循環(huán)都向枚舉器請求他的nextObject(下一個(gè)對象)
-(id)nextObject;返回nil時(shí)赢织,循環(huán)結(jié)束
注:不能通過添加或刪除對象這類方式來改變
字典:NSDictionary(也成為散列表或關(guān)聯(lián)類表)使用的是鍵查詢的優(yōu)化存儲(chǔ)方式
就是關(guān)鍵字及其定義的集合
NSDictionary在給定的關(guān)鍵字(通常是一個(gè)NSString字符串)下存儲(chǔ)一個(gè)數(shù)值(可以是任何類型的對象
與NSString和NSArray一樣只能使用NSMutableDictionary添加或者刪除
創(chuàng)建字典dictionaryWithObjectsAndKeys;
+(id)dictionaryWithObjectsAndKeys:
(id)firstObject馍盟,…;
objectForKey:獲取字典中得值于置,向方法傳遞之前用來存儲(chǔ)改制的關(guān)鍵字
-(id)objectForKey:(id)aKey;
添加元素
-(void)setObject:forkey
NSNumber類來包裝(即以對象形式實(shí)現(xiàn))基本數(shù)據(jù)類型:
創(chuàng)建NSNumber對象:
+(NSNumber *)numberWithChar:(char)??value;
+(NSNumber *)numberWithint:(int)value贞岭;
+(NSNumber *)numberWithFolatr?(float)value八毯;
+(NSNumber *)numberWithBOOL??(BOOL)value;
對初學(xué)者來說,Objective-C存在了很多令人費(fèi)解的寫法瞄桨,實(shí)際上他們是非常優(yōu)雅的话速。
程序員寫的最多的就是函數(shù)以及調(diào)用自己寫的或者別人寫的函數(shù)。本文就從函數(shù)的角度來看下Objective-C的優(yōu)雅之處芯侥。
C#和Objective-C同屬于c系列語言泊交。讓我們先看下C#的函數(shù)定義和調(diào)用,做個(gè)對比柱查。
C#函數(shù)的定義:
public?void?doIt(string?actorName,?string?movieName,?int?timesSeen)
{
Console.Write("{0}?is?my?favorite?actor?in?the?movie?{1},?I?saw?it?{2}?times.",?actorName,?movieName,?timesSeen);
}
函數(shù)的調(diào)用:
Class1?objMovie?=new?Class1();
objMovie.doIt("萊昂納多·迪卡普里奧","盜夢空間",?120);
在讓.net程序員看下Objective-C的定義:
-?(void)?doIt:(NSString?*)?actorName?movieName:?(NSString*)?value?timesSeen:?(int)times?{
NSLog(@"%@?is?my?favorite?actor?in?the?movie?%@,?I?saw?it?%i?times.",actorName,?value,?times);
}
如果你第一次看Objective-C廓俭,肯定會(huì)琢磨不透上面的代碼,懷疑是不是寫錯(cuò)了唉工。
對于上面這個(gè)函數(shù)的定義:
1研乒、'-'表示這個(gè)函數(shù)是實(shí)例函數(shù)(類似非靜態(tài)函數(shù)),'+'表示這個(gè)函數(shù)是類函數(shù)(類似靜態(tài)函數(shù))
2酵紫、(void)表示這個(gè)函數(shù)沒有返回值告嘲。
3、函數(shù)名是'doIt:'奖地,而不是'doIt'
4橄唬、參數(shù)用空格隔開
5、參數(shù)類型寫在括號(hào)中
6参歹、參數(shù)分內(nèi)部參數(shù)和外部參數(shù)仰楚,如電影名稱,內(nèi)部參數(shù)是:value犬庇,外部參數(shù)是:movieName
7僧界、函數(shù)的一個(gè)參數(shù)沒有外部參數(shù)的名稱,有內(nèi)部參數(shù)名臭挽。如:actorName捂襟。
調(diào)用:
從上面代碼可以看出除了第一個(gè)參數(shù),其余的參數(shù)都可以加上外部參數(shù)名稱用于區(qū)別欢峰。
從上面可以看出Objective-C和C#區(qū)別很大葬荷,實(shí)在會(huì)令.net程序員費(fèi)解涨共。Objective-C函數(shù)設(shè)計(jì)的優(yōu)雅之處在于即有內(nèi)部參數(shù)名又有外部參數(shù)名,可以不用在再內(nèi)部定義變量來存放函數(shù)的參數(shù)宠漩。
對Objective-C函數(shù)學(xué)習(xí)的一個(gè)簡單總結(jié)举反。
運(yùn)行過程
1.編寫OC程序:.m源文件
2.編譯.m文件為.o目標(biāo)文件:cc -c xxxx.m
3.鏈接.o文件為a.out可執(zhí)行文件:cc xxxx.o -framework Foundation
4.執(zhí)行a.out文件:./a.out
#import 的功能跟#include一樣,只是更好用扒吁,他避免了頭文件的多次包含
為了能使用OC的特性火鼻, 一定要引入#import
類定義//?@implementation 和 @end
// @implementation 和 @end
// : NSObject :讓Car這個(gè)類具備創(chuàng)建對象的能力(繼承)
@implementation Car : NSObject
// 這個(gè)大括號(hào)里面只能寫所有的屬性
{
// @public:讓對象的屬性可以被外面的指針訪問,默認(rèn)是私有的
@public
int wheels; // 默認(rèn)基本數(shù)據(jù)類型的初始值都是0
}
// 在@end的前面,大括號(hào){}外面寫行為
// 給Car對象增加一個(gè)行為(方法)
// 給對象增加一個(gè)行為雕崩,必須以減號(hào) - 開頭魁索, 給類增加一個(gè)對象是+。
// OC方法中的小括號(hào)()只是主要擴(kuò)住類型
- (void) run
{
// 訪問車子對象內(nèi)部的屬性晨逝,直接用屬性名就可以
NSLog(@"%i個(gè)輪子蛾默,%f時(shí)速的車子跑起來了!", wheels, speed);
}
+ (Void) test
{
// 這是類方法捉貌。上面那個(gè)-號(hào)的是對象方法支鸡。
}
@end
類調(diào)用
// 在OC中想執(zhí)行一些行為,首先寫個(gè) [行為執(zhí)行者? 行為名稱]
// new這個(gè)行為執(zhí)行完畢后趁窃,會(huì)返回這個(gè)對象的地址
Car *c = [Car new];
// 給c指向的車子對象的wheels屬性賦值
c->wheels = 4; // 等價(jià)于 (*c).wheels = 4
// 給指針變量c指向的對象“發(fā)送”一條run消息牧挣,讓這個(gè)對象執(zhí)行run這個(gè)行為
[c run];
聲明&實(shí)現(xiàn)
// 聲明一個(gè)類
/*
1.類名
2.繼承了NSObject
3.聲明屬性
4.聲明方法(僅僅是聲明,不需要實(shí)現(xiàn))
5.實(shí)現(xiàn)和聲明中的成員變量不能同名
*/
@interface Book : NSObject
{
@public
double price;// 這些屬性稱為對象的“成員變量”
}
// 聲明一個(gè)方法(行為)
- (void)reng;
@end
// 定義(實(shí)現(xiàn))一個(gè)類
/*
只用來實(shí)現(xiàn)@interface中聲明的方法
*/
@implementation Book
- (void)reng
{
NSLog(@"%f的書被扔了醒陆!", price);
}
多參數(shù)的聲明和使用
- (void) fly
{
NSLog(@"i can fly, my age is %d", age);
}
// 一個(gè)參數(shù)對應(yīng)一個(gè)冒號(hào)
// 冒號(hào)也是方法名的一部分
- (void)fly:(int)howHeight
{
NSLog(@"i can fly, my age is %d, my height %d", age, howHeight);
}
// 多個(gè)參數(shù)的情況瀑构。? withTime是方法名的一部分.times是參數(shù)名稱
- (void)fly:(int)howHeight :WithTime(int)times
{
}
Person *p = [Person new];
[p fly];
[p fly:99];
[p fly:99 WithTime:10];
OC對象方法和函數(shù)的區(qū)別
1. 函數(shù)屬于整個(gè)文件,在文件的任意地方都能調(diào)用刨摩;對象的方法只屬于這個(gè)對象寺晌,只有對象才能調(diào)用
2. 對象的方法只能聲明在@infterface 和@end 之間,對象方法只能實(shí)現(xiàn)在@implementation 和@end之間澡刹。
函數(shù)的聲明和定義可以寫在任意地方呻征,函數(shù)不能歸某個(gè)類所有,只屬于某個(gè)文件罢浇。
消息機(jī)制
給指針變量所指向的對象發(fā)送一條消息(消息名稱就是方法名)陆赋,讓那個(gè)對象執(zhí)行相應(yīng)的方法(動(dòng)態(tài))
1、Objective-C的類可以多重繼承么嚷闭?可以采用多個(gè)協(xié)議么攒岛?
答:不可以多重繼承,可以采用多個(gè)協(xié)議胞锰。
2灾锯、#import和#include的區(qū)別是什么?#import<> 跟 #import""有什么區(qū)別嗅榕?
#import能避免頭文件被重復(fù)包含的問題:
1) 一般來說顺饮,導(dǎo)入objective c的頭文件時(shí)用#import色乾,包含c/c++頭文件時(shí)用#include。
使用include要注意重復(fù)引用的問題:
class A领突,class B都引用了class C,class D若引用class A與class B,就會(huì)報(bào)重復(fù)引用的錯(cuò)誤案怯。
2)#import 確定一個(gè)文件只能被導(dǎo)入一次君旦,這使你在遞歸包含中不會(huì)出現(xiàn)問題。
所以嘲碱,#import比起#include的好處就是它避免了重復(fù)引用的問題金砍。所以在OC中我們基本用的都是import。
#import<> 包含iOS框架類庫里的類麦锯,#import""包含項(xiàng)目里自定義的類恕稠。
3、Category是什么扶欣?擴(kuò)展一個(gè)類的方式用繼承好還是類目好鹅巍?為什么?
答:Category是類目料祠。用類目好骆捧,因?yàn)槔^承要滿足a is a b的關(guān)系,而類目只需要滿足a has a b的關(guān)系髓绽,局限性更小敛苇,你不用定義子類就能擴(kuò)展一個(gè)類的功能,還能將類的定義分開放在不同的源文件里, 用Category去重寫類的方法顺呕,僅對本Category有效枫攀,不會(huì)影響到其他類與原有類的關(guān)系。
4株茶、延展是什么来涨?作用是什么?
答:延展(extension):在自己類的實(shí)現(xiàn)文件中添加類目來聲明私有方法忌卤。
5扫夜、類實(shí)例(成員)變量的@protected,@private,@public聲明各有什么含義?
@protected:受保護(hù)的驰徊,該實(shí)例變量只能在該類和其子類內(nèi)訪問笤闯,其他類內(nèi)不能訪問。
@private:私有的棍厂,該實(shí)例變量只能在該類內(nèi)訪問颗味,其他類內(nèi)不能訪問。
@public:共有的牺弹,該實(shí)例變量誰都可以訪問浦马。
6时呀、id聲明的對象有什么特性?
?? 沒有 * 號(hào)
?? 動(dòng)態(tài)數(shù)據(jù)類型
?? 可以指向任何類的對象(設(shè)置是nil)晶默,而不關(guān)心其具體類型
?? 在運(yùn)行時(shí)檢查其具體類型
?? 可以對其發(fā)送任何(存在的)消息
7谨娜、委托是什么?委托和委托方雙方的property聲明用什么屬性磺陡?為什么趴梢?
委托:一個(gè)對象保存另外一個(gè)對象的引用,被引用的對象實(shí)現(xiàn)了事先確定的協(xié)議币他,該協(xié)議用于將引用對象中的變化通知給被引用對象坞靶。
委托和委托方雙方的property聲明屬性都是assign而不是retain
為了避免循環(huán)引用造成的內(nèi)存泄露。
循環(huán)引用的問題這樣理解:
比如在main函數(shù)中創(chuàng)建了兩個(gè)類的對象A和B蝴悉,現(xiàn)在引用計(jì)數(shù)都是1≌靡酰現(xiàn)在讓A和B互相引用(A有一個(gè)屬性是B對象,屬性說明是retain拍冠;B有一個(gè)屬性是A對象尿这,屬性說明是retain),現(xiàn)在兩個(gè)對象的引用計(jì)數(shù)都增加了1倦微,都變成了2妻味。
現(xiàn)在執(zhí)行[A release]; [B release]; 此時(shí)創(chuàng)建對象的main函數(shù)已經(jīng)釋放了自己對對象的所有權(quán),但是此時(shí)A和B的引用計(jì)數(shù)都還是1欣福,因?yàn)樗麄兓ハ嘁昧恕?/p>
這時(shí)你發(fā)現(xiàn)A和B將無法釋放责球,因?yàn)橐脶尫臕必須先釋放B,在B的dealloc方法中再釋放A拓劝。同理雏逾,要想釋放B必須先釋放A,在A的dealloc方法中再釋放B郑临。所以這兩個(gè)對象將一直存在在內(nèi)存中而不釋放栖博。這就是所謂的循環(huán)引用的問題。要想解決這個(gè)問題厢洞,一般的方法可以將引用的屬性設(shè)置為assign,而不是retain來處理仇让。
8、淺拷貝和深拷貝區(qū)別是什么躺翻?
淺層復(fù)制:只復(fù)制指向?qū)ο蟮闹羔樕ミ矗粡?fù)制引用對象本身。
深層復(fù)制:復(fù)制引用對象本身公你。
意思就是說我有個(gè)A對象踊淳,復(fù)制一份后得到A_copy對象后,對于淺復(fù)制來說陕靠,A和A_copy指向的是同一個(gè)內(nèi)存資源迂尝,復(fù)制的只不過是是一個(gè)指針脱茉,對象本身資源還是只有一份,那如果我們對A_copy執(zhí)行了修改操作,那么發(fā)現(xiàn)A引用的對象同樣被修改垄开,這其實(shí)違背了我們復(fù)制拷貝的一個(gè)思想琴许。深復(fù)制就好理解了,內(nèi)存中存在了兩份獨(dú)立對象本身。
用網(wǎng)上一哥們通俗的話將就是:
淺復(fù)制好比你和你的影子溉躲,你完蛋虚吟,你的影子也完蛋
深復(fù)制好比你和你的克隆人,你完蛋签财,你的克隆人還活著。
9偏塞、內(nèi)存管理的幾條原則是什么唱蒸?按照默認(rèn)法則,哪些關(guān)鍵字生成的對象需要手動(dòng)釋放灸叼?哪些情況下不需要手動(dòng)釋放神汹,會(huì)直接進(jìn)入自動(dòng)釋放池?
??????? 當(dāng)使用new古今、alloc或copy方法創(chuàng)建一個(gè)對象時(shí)屁魏,該對象引用計(jì)數(shù)器為1。如果不需要使用該對象捉腥,可以向其發(fā)送release或autorelease消息氓拼,在其使用完畢時(shí)被銷毀。
??????? 如果通過其他方法獲取一個(gè)對象抵碟,則可以假設(shè)這個(gè)對象引用計(jì)數(shù)為1桃漾,并且被設(shè)置為autorelease,不需要對該對象進(jìn)行清理拟逮,如果確實(shí)需要retain這個(gè)對象撬统,則需要使用完畢后release。
??????? 如果retain了某個(gè)對象敦迄,需要release或autorelease該對象恋追,保持retain方法和release方法使用次數(shù)相等。
使用new罚屋、alloc苦囱、copy關(guān)鍵字生成的對象和retain了的對象需要手動(dòng)釋放。設(shè)置為autorelease的對象不需要手動(dòng)釋放沿后,會(huì)直接進(jìn)入自動(dòng)釋放池沿彭。
10、怎樣實(shí)現(xiàn)一個(gè)單例模式的類尖滚,給出思路喉刘,不寫代碼瞧柔。
??????? 首先必須創(chuàng)建一個(gè)全局實(shí)例,通常存放在一個(gè)全局變量中,此全局變量設(shè)置為nil
??????? 提供工廠方法對該全局實(shí)例進(jìn)行訪問睦裳,檢查該變量是否為nil造锅,如果nil就創(chuàng)建一個(gè)新的實(shí)例,最后返回全局實(shí)例
??????? 全局變量的初始化在第一次調(diào)用工廠方法時(shí)會(huì)在+allocWithZone:中進(jìn)行廉邑,所以需要重寫該方法哥蔚,防止通過標(biāo)準(zhǔn)的alloc方式創(chuàng)建新的實(shí)例
??????? 為了防止通過copy方法得到新的實(shí)例,需要實(shí)現(xiàn)-copyWithZone方法
??????? 只需在此方法中返回本身對象即可蛛蒙,引用計(jì)數(shù)也不需要進(jìn)行改變糙箍,因?yàn)閱卫J较碌膶ο笫遣辉试S銷毀的寺渗,所以也就不用保留
??????? 因?yàn)槿謱?shí)例不允許釋放锌订,所以retain,release,autorelease方法均需重寫
11、@class的作用是什么乃正?
答:在頭文件中诺苹, 一般只需要知道被引用的類的名稱就可以了咕晋。 不需要知道其內(nèi)部的實(shí)體變量和方法,所以在頭文件中一般使用@class來聲明這個(gè)名稱是類的名稱收奔。 而在實(shí)現(xiàn)類里面掌呜,因?yàn)闀?huì)用到這個(gè)引用類的內(nèi)部的實(shí)體變量和方法,所以需要使用#import來包含這個(gè)被引用類的頭文件坪哄。
??????? @class的作用是告訴編譯器质蕉,有這么一個(gè)類,用吧翩肌,沒有問題
??????? @class還可以解決循環(huán)依賴的問題饰剥,例如A.h導(dǎo)入了B.h,而B.h導(dǎo)入了A.h摧阅,每一個(gè)頭文件的編譯都要讓對象先編譯成功才行
??????? 使用@class就可以避免這種情況的發(fā)生
12汰蓉、KVC是什么?KVO是什么?有什么特點(diǎn)?
??????? KVC是鍵值編碼棒卷,特點(diǎn)是通過指定表示要訪問的屬性名字的字符串標(biāo)識(shí)符顾孽,可以進(jìn)行類的屬性讀取和設(shè)置
??????? KVO是鍵值觀察,特點(diǎn)是利用鍵值觀察可以注冊成為一個(gè)對象的觀察者比规,在該對象的某個(gè)屬性變化時(shí)收到通知
13若厚、MVC是什么?有什么特性蜒什?
–????? MVC是一種設(shè)計(jì)模式测秸,由模型、視圖、控制器3部分組成霎冯。
–????? 模型:保存應(yīng)用程序數(shù)據(jù)的類铃拇,處理業(yè)務(wù)邏輯的類
–????? 視圖:窗口,控件和其他用戶能看到的并且能交互的元素
–????? 控制器:將模型和試圖綁定在一起沈撞,確定如何處理用戶輸入的類
14慷荔、定義屬性時(shí),什么情況使用copy缠俺、assign显晶、retain?
使用assign: 對基礎(chǔ)數(shù)據(jù)類型 (NSInteger壹士,CGFloat)和C數(shù)據(jù)類型(int, float,double, char, 等等)
使用copy: 希望獲得源對象的副本而不改變源對象內(nèi)容時(shí)磷雇,對NSString
使用retain: 希望獲得源對象的所有權(quán)時(shí),對其他NSObject和其子類
15.屬性readwrite躏救,readonly倦春,assign,retain落剪,copy,nonatomic 各是什么作用尿庐,在那種情況下用忠怖?
assign用于簡單數(shù)據(jù)類型,如NSInteger,double,bool,
retain和copy用于對象抄瑟,
readwrite是可讀可寫特性凡泣;需要生成getter方法和setter方法時(shí)
readonly是只讀特性 ?只會(huì)生成getter方法 不會(huì)生成setter方法?;不希望屬性在類外改變
assign是賦值特性,setter方法將傳入?yún)?shù)賦值給實(shí)例變量皮假;僅設(shè)置變量時(shí)鞋拟;
retain表示持有特性,setter方法將傳入?yún)?shù)先保留惹资,再賦值贺纲,傳入?yún)?shù)的retaincount會(huì)+1;
copy表示賦值特性,setter方法將傳入對象復(fù)制一份褪测;需要完全一份新的變量時(shí)猴誊。
nonatomic非原子操作,決定編譯器生成的setter getter是否是原子操作侮措,atomic表示多線程安全懈叹,一般使用nonatomic
16.id 聲明的對象有什么特性?
答:Id聲明的對象具有運(yùn)行時(shí)的特性分扎,即可以指向任意類型的objcetive-c的對象澄成;
17.Objective-C如何對內(nèi)存管理的,說說你的看法和解決方法?
答:Objective-C的內(nèi)存管理主要有三種方式ARC(自動(dòng)內(nèi)存計(jì)數(shù))、手動(dòng)內(nèi)存計(jì)數(shù)、內(nèi)存池墨状。
18.內(nèi)存管理的幾條原則時(shí)什么卫漫?
誰申請,誰釋放
遵循Cocoa Touch的使用原則歉胶;
內(nèi)存管理主要要避免“過早釋放”和“內(nèi)存泄漏”汛兜,對于“過早釋放”需要注意@property設(shè)置特性時(shí),一定要用對特性關(guān)鍵字通今,對于“內(nèi)存泄漏”粥谬,一定要申請了要負(fù)責(zé)釋放,要細(xì)心辫塌。
19.那些關(guān)鍵字生成的對象 需要手動(dòng)釋放漏策?
答:關(guān)鍵字alloc 或new 生成的對象需要手動(dòng)釋放
20在和property結(jié)合的時(shí)候怎樣有效的避免內(nèi)存泄露?
答:設(shè)置正確的property屬性臼氨,對于retain需要在合適的地方釋放
21.如何對iOS設(shè)備進(jìn)行性能測試?
Profile-> Instruments ->Time Profiler
22.Object-c的類可以多重繼承么掺喻?可以實(shí)現(xiàn)多個(gè)接口么?
答:Object-c的類不可以多重繼承储矩;可以實(shí)現(xiàn)多個(gè)接口感耙,通過實(shí)現(xiàn)多個(gè)接口可以完成C++的多重繼承;
23.Category是什么持隧?重寫一個(gè)類的方式用繼承好還是分類好即硼?為什么?
答:Category是類別屡拨,一般情況用分類好只酥,用Category去重寫類的方法,僅對本Category有效呀狼,不會(huì)影響到其他類與原有類的關(guān)系裂允。
24.描述一下iOS SDK中如何實(shí)現(xiàn)MVC的開發(fā)模式
MVC是模型、試圖哥艇、控制開發(fā)模式绝编,對于iOS SDK,所有的View都是視圖層的貌踏,它應(yīng)該獨(dú)立于模型層瓮增,由視圖控制層來控制。所有的用戶數(shù)據(jù)都是模型層哩俭,它應(yīng)該獨(dú)立于視圖绷跑。所有的ViewController都是控制層,由它負(fù)責(zé)控制視圖凡资,訪問模型數(shù)據(jù)
25. Object C中創(chuàng)建線程的方法是什么砸捏?如果在主線程中執(zhí)行代碼谬运,方法是什么?如果想延時(shí)執(zhí)行代碼垦藏、方法又是什么梆暖?
線程創(chuàng)建有三種方法:使用NSThread創(chuàng)建、使用 GCD的dispatch掂骏、使用子類化的NSOperation,然后將其加入NSOperationQueue;在主線程執(zhí)行代碼轰驳,方法是 performSelectorOnMainThread,如果想延時(shí)執(zhí)行代碼可以用performSelector:onThread:withObject:waitUntilDone
26弟灼、iPhone5 的屏幕分辨率大小為? 1136*?640? ?
答:屏幕分辨率:用于量度位圖圖像內(nèi)數(shù)據(jù)量多少的一個(gè)參數(shù)级解。通常表示成ppi(每英寸像素Pixel per inch)。屏幕物理尺寸不變田绑,分辨率越高勤哗,每單位面積內(nèi)包含的細(xì)節(jié)(像素點(diǎn))越多。
27掩驱、struct strA {??????int a;???? float b;?? char c;? } expA;
printf("%ld",sizeof(expA));? ???輸出結(jié)果為? 12? 芒划?
該問題涉及編譯器的“內(nèi)存對齊”問題:
現(xiàn)代計(jì)算機(jī)中內(nèi)存空間都是按照byte(字節(jié))劃分的,從理論上講似乎對任何類型的變量的訪問可以從任何地址開始欧穴,但實(shí)際情況是在訪問特定變量的時(shí)候經(jīng)常在特定的內(nèi)存地址訪問民逼,這就需要各類型數(shù)據(jù)按照一定的規(guī)則在空間上排列,而不是順序的一個(gè)接一個(gè)的排放涮帘,這就是對齊拼苍。
對齊的作用和原因:各個(gè)硬件平臺(tái)對存儲(chǔ)空間的處理上有很大的不同。一些平臺(tái)對某些特定類型的數(shù)據(jù)只能從某些特定地址開始存取焚辅。其他平臺(tái)可能沒有這種情況, 但是最常見的是如果不按照適合其平臺(tái)的要求對數(shù)據(jù)存放進(jìn)行對齊苟鸯,會(huì)在存取效率上帶來損失同蜻。比如有些平臺(tái)每次讀都是從偶地址開始,如果一個(gè)int型(假設(shè)為 32位)如果存放在偶地址開始的地方早处,那么一個(gè)讀周期就可以讀出湾蔓,而如果存放在奇地址開始的地方,就可能會(huì)需要2個(gè)讀周期砌梆,并對兩次讀出的結(jié)果的高低 字節(jié)進(jìn)行拼湊才能得到該int數(shù)據(jù)默责。顯然在讀取效率上下降很多。這也是空間和時(shí)間的博弈咸包。
通常桃序,我們寫程序的時(shí)候,不需要考慮對齊問題烂瘫。編譯器會(huì)替我們選擇適合目標(biāo)平臺(tái)的對齊策略媒熊。當(dāng)然,我們也可以通知給編譯器傳遞預(yù)編譯指令而改變對指定數(shù)據(jù)的對齊方法。
但是芦鳍,正因?yàn)槲覀円话悴恍枰P(guān)心這個(gè)問題嚷往,所以因?yàn)榫庉嬈鲗?shù)據(jù)存放做了對齊,而我們不了解的話柠衅,常常會(huì)對一些問題感到迷惑皮仁。最常見的就是struct數(shù)據(jù)結(jié)構(gòu)的sizeof結(jié)果,出乎意料菲宴。
對于結(jié)構(gòu)體來說贷祈,按成員中所占字節(jié)最大的是float類型,占用4個(gè)字節(jié)裙顽,一共有3個(gè)成員付燥,所以總的占用字節(jié)為:4* 3 = 12.
可通過編譯器命令來設(shè)定:
#progma pack (2)
28、@property語法中readonly/readwrite愈犹,atomic/nonatomic的作用键科,@dynamic的作用?
@Property:Objective-C語言關(guān)鍵詞漩怎,與@synthesize配對使用勋颖。xcode4.5以及以后的版本,@synthesize可以省略勋锤。
功能:讓編譯器自動(dòng)編寫一對與數(shù)據(jù)成員同名的方法聲明來省去讀寫方法的聲明饭玲。
聲明property的語法為:
@property (參數(shù)1,參數(shù)2) 類型 名字;
如:@property(nonatomic,retain) UIWindow *window;
其中參數(shù)主要分為三類:
讀寫屬性: (readwrite/readonly)
setter語意:(assign/retain/copy)
原子性: (atomicity/nonatomic)
各參數(shù)意義如下:
readwrite:同時(shí)產(chǎn)生setter\getter方法
readonly:只產(chǎn)生簡單的getter,沒有setter。
assign:默認(rèn)類型,setter方法直接賦值叁执,而不進(jìn)行retain操作
retain:setter方法對參數(shù)進(jìn)行release舊值茄厘,再retain新值。
copy:setter方法進(jìn)行Copy操作谈宛,與retain一樣
atomic:原子性次哈,它沒有一個(gè)如果你沒有對原子性進(jìn)行一個(gè)聲明(atomic or nonatomic),那么系統(tǒng)會(huì)默認(rèn)你選擇的是atomic吆录。
原子性就是說一個(gè)操作不可以被中途cpu暫停然后調(diào)度, 即不能被中斷, 要不就執(zhí)行完, 要不就不執(zhí)行. 如果一個(gè)操作是原子性的,那么在多線程環(huán)境下, 就不會(huì)出現(xiàn)變量被修改等奇怪的問題窑滞。原子操作就是不可再分的操作,在多線程程序中原子操作是一個(gè)非常重要的概念恢筝,它常常用來實(shí)現(xiàn)一些同步機(jī)制哀卫,同時(shí)也是一些常見的多線程Bug的源頭。當(dāng)然撬槽,原子性的變量在執(zhí)行效率上要低些此改。
關(guān)于異步與同步:并非同步就是不好,我們通常需要同時(shí)進(jìn)行多個(gè)操作侄柔,這時(shí)使用異步带斑,而對于程序來說鼓寺,一般就是使用多線程,然而我們很多時(shí)候需要在多個(gè)線程間訪問共享的數(shù)據(jù)勋磕,這個(gè)時(shí)候又需要同步來保證數(shù)據(jù)的準(zhǔn)確性或訪問的先后次序妈候。當(dāng)有多個(gè)線程需要訪問到同一個(gè)數(shù)據(jù)時(shí),OC中挂滓,我們可以使用@synchronized(變量)來對該變量進(jìn)行加鎖(加鎖的目的常常是為了同步或保證原子操作)苦银。
nonatomic:非原子性,是直接從內(nèi)存中取數(shù)值赶站,因?yàn)樗菑膬?nèi)存中取得數(shù)據(jù)幔虏,它并沒有一個(gè)加鎖的保護(hù)來用于cpu中的寄存器計(jì)算Value,它只是單純的從內(nèi)存地址中贝椿,當(dāng)前的內(nèi)存存儲(chǔ)的數(shù)據(jù)結(jié)果來進(jìn)行使用想括。在多線環(huán)境下可提高性能,但無法保證數(shù)據(jù)同步烙博。
29瑟蜈、OSI(Open System Interconnection)開放式系統(tǒng)互聯(lián)參考模型 把網(wǎng)絡(luò)協(xié)議從邏輯上分為了7層,試列舉常見的應(yīng)用層協(xié)議渣窜。
注意問的是應(yīng)用層協(xié)議铺根,有些同學(xué)直接答了七層模型。
在開放系統(tǒng)互連(OSI)模型中的最高層乔宿,為應(yīng)用程序提供服務(wù)以保證通信位迂,但不是進(jìn)行通信的應(yīng)用程序本身。
Telnet協(xié)議是TCP/IP協(xié)議族中的一員详瑞,是Internet遠(yuǎn)程登陸服務(wù)的標(biāo)準(zhǔn)協(xié)議和主要方式掂林。它為用戶提供了在本地計(jì)算機(jī)上完成遠(yuǎn)程主機(jī)工作的能力。
FTP文件傳輸協(xié)議是TCP/IP網(wǎng)絡(luò)上兩臺(tái)計(jì)算機(jī)傳送文件的協(xié)議坝橡,F(xiàn)TP是在TCP/IP網(wǎng)絡(luò)和INTERNET上最早使用的協(xié)議之一泻帮,它屬于網(wǎng)絡(luò)協(xié)議組的應(yīng)用層。
超文本傳輸協(xié)議 (HTTP-Hypertext transfer protocol) 是分布式驳庭,協(xié)作式刑顺,超媒體系統(tǒng)應(yīng)用之間的通信協(xié)議氯窍。是萬維網(wǎng)(world wide web)交換信息的基礎(chǔ)饲常。
SMTP(Simple MailTransfer Protocol)即簡單郵件傳輸協(xié)議,它是一組用于由源地址到目的地址傳送郵件的規(guī)則,由它來控制信件的中轉(zhuǎn)方式狼讨,它幫助每臺(tái)計(jì)算機(jī)在發(fā)送或中轉(zhuǎn)信件時(shí)找到下一個(gè)目的地贝淤。
時(shí)間協(xié)議(TIME protocol)是一個(gè)在RFC 868內(nèi)定義的網(wǎng)絡(luò)協(xié)議。它用作提供機(jī)器可讀的日期時(shí)間資訊政供。
DNS 是域名系統(tǒng) (Domain NameSystem) 的縮寫播聪,是因特網(wǎng)的一項(xiàng)核心服務(wù)朽基,它作為可以將域名和IP地址相互映射的一個(gè)分布式數(shù)據(jù)庫。
SNMP(Simple Network ManagementProtocol,簡單網(wǎng)絡(luò)管理協(xié)議)的前身是簡單網(wǎng)關(guān)監(jiān)控協(xié)議(SGMP)离陶,用來對通信線路進(jìn)行管理稼虎。
TFTP(Trivial FileTransfer Protocol,簡單文件傳輸協(xié)議)是TCP/IP協(xié)議族中的一個(gè)用來在客戶機(jī)與服務(wù)器之間進(jìn)行簡單文件傳輸?shù)膮f(xié)議,提供不復(fù)雜招刨、開銷不大的文件傳輸服務(wù)霎俩。端口號(hào)為69。
30沉眶、網(wǎng)絡(luò)傳輸層協(xié)議中打却,基于TCP/IP協(xié)議和UDP/IP的連接有什么區(qū)別?
TCP:TransmissionControl Protocol 傳輸控制協(xié)議TCP是一種面向連接(連接導(dǎo)向)的谎倔、可靠的柳击、基于字節(jié)流的運(yùn)輸層(Transport layer)通信協(xié)議,由IETF的RFC 793說明(specified)片习。
UDP 是User DatagramProtocol的簡稱捌肴, 中文名是用戶數(shù)據(jù)包協(xié)議,是OSI 參考模型中一種無連接的傳輸層協(xié)議毯侦,提供面向事務(wù)的簡單不可靠信息傳送服務(wù)哭靖,IETF RFC 768是UDP的正式規(guī)范。
面向連接:是指通信雙方在通信時(shí)侈离,要事先建立一條通信線路试幽,其有三個(gè)過程:建立連接、使用連接和釋放連接卦碾。電話系統(tǒng)是一個(gè)面向連接的模式铺坞,撥號(hào)、通話洲胖、掛機(jī)济榨;TCP協(xié)議就是一種面向連接的協(xié)議。
面向無連接:是指通信雙方不需要事先建立一條通信線路绿映,而是把每個(gè)帶有目的地址的包(報(bào)文分組)送到線路上擒滑,由系統(tǒng)自主選定路線進(jìn)行傳輸。郵政系統(tǒng)是一個(gè)無連接的模式叉弦,天羅地網(wǎng)式的選擇路線丐一,天女散花式的傳播形式;IP淹冰、UDP協(xié)議就是一種無連接協(xié)議库车。
31、簡述MVC模式中M樱拴、V柠衍、C分別指代什么及發(fā)揮的作用洋满?
MVC開始是存在于Desktop(桌面)程序中的,M是指數(shù)據(jù)模型珍坊,V是指用戶界面牺勾,C則是控制器,使用MVC的目的是將M和V的實(shí)現(xiàn)代碼分離阵漏。C存在的目的則是確保M和V的同步禽最,一旦M改變,V應(yīng)該同步更新袱饭。
視圖是用戶看到并與之交互的界面川无,視圖沒有真正的處理發(fā)生,不管這些數(shù)據(jù)是聯(lián)機(jī)存儲(chǔ)的還是一個(gè)雇員列表虑乖,作為視圖來講懦趋,它只是作為一種輸出數(shù)據(jù)并允許用戶操縱的方式。
模型表示企業(yè)數(shù)據(jù)和業(yè)務(wù)規(guī)則疹味,模型返回的數(shù)據(jù)是中立的仅叫,就是說模型與數(shù)據(jù)格式無關(guān),這樣一個(gè)模型能為多個(gè)視圖提供數(shù)據(jù)糙捺,由于應(yīng)用于模型的代碼只需寫一次就可以被多個(gè)視圖重用诫咱,所以減少了代碼的重復(fù)性。
控制器接受用戶的輸入并調(diào)用模型和視圖去完成用戶的需求洪灯,控制器本身不輸出任何東西和做任何處理坎缭。它只是接收請求并決定調(diào)用哪個(gè)模型構(gòu)件去處理請求,然后再確定用哪個(gè)視圖來顯示返回的數(shù)據(jù)签钩。
32掏呼、聲明@property的語法中,retain铅檩、copy憎夷、assign的含義及作用?試寫出 @property中帶retain和assign關(guān)鍵字昧旨,通過@synthesize自動(dòng)生成的的合成存取方法(set拾给、get方法)的實(shí)現(xiàn)代碼。
getter分析:
@property (nonatomic, retain) test*aTest;
@property (nonatomic, copy) test*aTest;
等效代碼:
-(void)aTest {
return aTest;
}
========== 貌似我是分割線 ===========
@property (retain) test* aTest;
@property (copy) test* aTest;
等效代碼:
-(void)aTest
{
[aTest ?retain];
return [aTest ?autorelease];
}
setter分析:
@property (nonatomic, retain) test*aTest;
@property (retain) test* aTest;
等效于:
-(void)setaTest:(test *)newaTest {
if (aTest !=newaTest) {
[aTest? release];
aTest = [newaTest ?retain];
}
}
========== 貌似我是分割線 ===========
@property (nonatomic, copy) test*aTest;
@property (copy) test* aTest;
等效于:
-(void)setaTest:(test *)newaTest {
if (aTest != newaTest){
[aTest? release];
aTest = [newaTest ?copy];
}
}
33兔沃、iOS中有哪些回調(diào)機(jī)制蒋得,并作簡單的比較。
各種回調(diào)機(jī)制的比較:
1)目標(biāo)動(dòng)作對:當(dāng)兩個(gè)對象之間有比較緊密的關(guān)系時(shí)粘拾,如視圖控制器與其下的某個(gè)視圖窄锅。
2)代理:也叫委托创千,當(dāng)某個(gè)對象收到多個(gè)事件缰雇,并要求同一個(gè)對象來處理所有事件時(shí)入偷。委托機(jī)制依賴于某個(gè)協(xié)議定義的方法來發(fā)送消息。
3)通告機(jī)制:當(dāng)需要多個(gè)對象或兩個(gè)無關(guān)對象處理同一個(gè)事件時(shí)械哟。
4)Block:適用于回調(diào)只發(fā)生一次的簡單任務(wù)疏之。
34、列出在編碼中哪些編碼習(xí)慣有助于提高代碼質(zhì)量暇咆、軟件性能和健壯性锋爪,減少程序崩潰。
#使用嚴(yán)格的命名規(guī)則(如匈牙利命名法)能夠避免不必要的類型轉(zhuǎn)換錯(cuò)誤爸业。
#在編碼前先設(shè)計(jì)好流程圖或使用偽代碼其骄,清晰化整個(gè)設(shè)計(jì)意圖。
#對自己的代碼進(jìn)行嚴(yán)格的單元測試(unit testing)扯旷。
單元測試是指對軟件中的最小可測試單元進(jìn)行檢查和驗(yàn)證拯爽。如C語言中單元指一個(gè)函數(shù),Java里單元指一個(gè)類,圖形化的軟件中可以指一個(gè)窗口或一個(gè)菜單等∩ǎ總的來說换棚,單元就是人為規(guī)定的最小的被測功能模塊。單元測試是在軟件開發(fā)過程中要進(jìn)行的最低級別的測試活動(dòng)揩悄,軟件的獨(dú)立單元將在與程序的其他部分相隔離的情況下進(jìn)行測試。
#異常的處理
首先不要輕易使用異常的捕獲,其次要盡可能捕獲具體的異常为迈。對于異常的處理最好能夠采用封裝的方式,大家統(tǒng)一使用缺菌。這樣可以保證異常處理的一致性也可以保證當(dāng)異常出現(xiàn)時(shí)性能的穩(wěn)定曲尸。
# 使用內(nèi)省的方法檢查方法的輸入
#采用增量式的編程方式。
采用增量式編程和測試男翰,會(huì)傾向于創(chuàng)建更小的方法和更具內(nèi)聚性的類另患。你應(yīng)該經(jīng)常評估代碼質(zhì)量,并不時(shí)的進(jìn)行許多小調(diào)整蛾绎,而不是一次修改許多東西昆箕。在寫了幾行代碼之后,就應(yīng)該進(jìn)行一次構(gòu)建/測試租冠。在沒有得到反饋時(shí)鹏倘,你不要走的太遠(yuǎn)。
#使用工具(如Instrument)來幫助檢查內(nèi)存泄漏顽爹、過早釋放內(nèi)存纤泵、CPU使用效率等問題。
#消除所有的編譯警告镜粤,警告就是錯(cuò)誤捏题。
#寫防御性的代碼玻褪,使用內(nèi)省的方法檢查傳入的參數(shù)。
35公荧、JSON中{ }代表_____带射,[ ]代表_____,試將下面的JSON串用OC對象表示出來:
{ "people": [
{ "firstName": "Brett","lastName":"McLaughlin", "email":"aaaa" },
{ "firstName": "Jason","lastName":"Hunter", "email": "bbbb"},
{ "firstName": "Elliotte","lastName":"Harold", "email": "cccc" }
]循狰,
“l(fā)ocation”:”中華人民共和國”
}
JSON中{ }代表對象窟社,數(shù)據(jù)結(jié)構(gòu)為{key1:value1, key2:value2, key3:…… }
[ ]代表數(shù)組,與其他語言中的數(shù)組類似绪钥。
//
@interface People: NSObject
@property(nonatomic, copy) NSString* strFirstName;
@property(nonatomic, copy) NSString* strLastName;
@property(nonatomic, copy) NSString* strEmail;
@end
//
@interfaceJSonData : NSObject
@property(nonatomic, retain) NSMutableArray* arrPeople; ?// 存放People對象
@property(nonatomic, copy) NSString* strLocation;
@end
36.??Object-C有多繼承嗎灿里?沒有的話用什么代替?
答:沒有程腹,cocoa 中所有的類都是NSObject 的子類钠四,多繼承在這里是用protocol 委托代理來實(shí)現(xiàn)的?,ood的多態(tài)特性在obj-c中通過委托來實(shí)現(xiàn)跪楞。
37.bject-C有私有方法嗎缀去?私有變量呢?
objective-c – 類里面的方法只有兩種, 靜態(tài)方法和實(shí)例方法.
在類里面聲名一個(gè)私有方法@interface Controller : NSObject
{ NSString *something;
}+ (void)thisIsAStaticMethod;–(void)thisIsAnInstanceMethod;@end@interface Controller
(private)
-(void)thisIsAPrivateMethod;@end
@private可以用來修飾私有變量在Objective‐C中甸祭,所有實(shí)例變量默認(rèn)都是私有的缕碎,所有實(shí)例方法默認(rèn)都是公有的
38.? 堆和棧的區(qū)別?
管理方式:對于棧來講池户,是由編譯器自動(dòng)管理咏雌,無需我們手工控制;對于堆來說校焦,釋放工作由程序員控制赊抖,容易產(chǎn)生memory leak。
申請大姓洹:棧:棧是向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu)氛雪,是一塊連續(xù)的內(nèi)存的區(qū)域
堆:是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域耸成。
分配方式:堆都是動(dòng)態(tài)分配的 报亩,動(dòng)態(tài)分配由alloca函數(shù)進(jìn)行分配
棧的動(dòng)態(tài)分配由編譯器進(jìn)行釋放,無需我們手工實(shí)現(xiàn)
39. kvc和kvo的區(qū)別井氢?
kvc:鍵值編碼弦追,是一種間接訪問對象的屬性,使用字符串來標(biāo)示屬性
kvo:鍵值觀察機(jī)制花竞,提供了觀察某一屬性變化的方法
40. 線程和進(jìn)程的區(qū)別劲件?
答:主要不同的是操作系統(tǒng)資源管理方式
線程是一個(gè)進(jìn)程中不同的執(zhí)行路徑,線程有自己的堆、局部變量
進(jìn)程有獨(dú)立的地址空間零远,一個(gè)線程死掉苗分,整個(gè)進(jìn)程就會(huì)死掉
41.??#import和#include的區(qū)別,@class代表什么遍烦?
答:@class一般用于頭文件中需要聲明該類的某個(gè)實(shí)例變量的時(shí)候用到,在m文件中還是需要使用#import而#import比起#include的好處就是不會(huì)引起重復(fù)包含躺枕。
42. 類別的作用服猪?
答:有時(shí)我們需要在一個(gè)已經(jīng)定義好的類中增加一些方法,而不想去重寫該類拐云“罩恚可以使用類別對該類擴(kuò)充新的方法。
注意:類別只能擴(kuò)充方法叉瘩,而不能擴(kuò)充成員變量膳帕。
代理的作用
委托代理(degegate),目的是改變和傳遞控制鏈
顧名思義薇缅,把某個(gè)對象要做的事情委托給別的對象去做危彩。那么別的對象就是這個(gè)對象的代理,代替它來打理要做的事泳桦。反映到程序中汤徽,首先要明確一個(gè)對象的委托方是哪個(gè)對象,委托所做的內(nèi)容是什么灸撰。
委托機(jī)制是一種設(shè)計(jì)模式谒府。
多態(tài):子類的指針可以賦值給父類
43.鏈表和數(shù)組的區(qū)別在哪里?
二者都屬于一種數(shù)據(jù)結(jié)構(gòu)
從邏輯結(jié)構(gòu)來看
1. 數(shù)組必須事先定義固定的長度(元素個(gè)數(shù)),不能適應(yīng)數(shù)據(jù)動(dòng)態(tài)地增減的情況浮毯。當(dāng)數(shù)據(jù)增加時(shí)完疫,可能超出原先定義的元素個(gè)數(shù);當(dāng)數(shù)據(jù)減少時(shí)债蓝,造成內(nèi)存浪費(fèi)壳鹤;數(shù)組可以根據(jù)下標(biāo)直接存取。
2. 鏈表動(dòng)態(tài)地進(jìn)行存儲(chǔ)分配饰迹,可以適應(yīng)數(shù)據(jù)動(dòng)態(tài)地增減的情況器虾,且可以方便地插入、刪除數(shù)據(jù)項(xiàng)蹦锋。(數(shù)組中插入兆沙、刪除數(shù)據(jù)項(xiàng)時(shí),需要移動(dòng)其它數(shù)據(jù)項(xiàng)莉掂,非常繁瑣)鏈表必須根據(jù)next指針找到下一個(gè)元素
從內(nèi)存存儲(chǔ)來看
1. (靜態(tài))數(shù)組從棧中分配空間, 對于程序員方便快速,但是自由度小
2. 鏈表從堆中分配空間, 自由度大但是申請管理比較麻煩
從上面的比較可以看出葛圃,如果需要快速訪問數(shù)據(jù),很少或不插入和刪除元素,就應(yīng)該用數(shù)組库正;相反曲楚, 如果需要經(jīng)常插入和刪除元素就需要用鏈表數(shù)據(jù)結(jié)構(gòu)了。
44. main()
{ int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}
答:2,5?? *(a+1)就是a[1]褥符,*(ptr-1)就是a[4],執(zhí)行結(jié)果是2龙誊,5
&a+1不是首地址+1,系統(tǒng)會(huì)認(rèn)為加一個(gè)a數(shù)組的偏移喷楣,是偏移了一個(gè)數(shù)組的大刑舜蟆(本例是5個(gè)int)
int *ptr=(int *)(&a+1);則ptr實(shí)際是&(a[5]),也就是a+5
原因如下:&a是數(shù)組指針,其類型為 int (*)[5];
而指針加1要根據(jù)指針類型加上一定的值铣焊,不同類型的指針+1之后增加的大小不同逊朽。
a是長度為5的int數(shù)組指針,所以要加 5*sizeof(int)曲伊,所以ptr實(shí)際是a[5]叽讳,
但是prt與(&a+1)類型是不一樣的(這點(diǎn)很重要),所以prt-1只會(huì)減去sizeof(int*)
a,&a的地址是一樣的坟募,但意思不一樣
a是數(shù)組首地址岛蚤,也就是a[0]的地址,&a是對象(數(shù)組)首地址懈糯,???? ????a+1是數(shù)組下一元素的地址灭美,即a[1],&a+1是下一個(gè)對象的地址,即a[5].
45. 寫一個(gè)委托的interface
@protocol MyDelegate;
@interface MyClass: NSObject
{??? id
delegate; }
//委托方法@protocol MyDelegate- (void)didJobs:(NSArray *)args;
@end
46. 寫一個(gè)NSString類的實(shí)現(xiàn)
+(id)initWithCString:(const char *)nullTerminatedCStringencoding:(NSStringEncoding)encoding;
+ (id)stringWithCString: (const char*)nullTerminatedCString?????????????encoding: (NSStringEncoding)encoding
{?? NSString?*obj;
obj = [selfallocWithZone: NSDefaultMallocZone()];
obj = [objinitWithCString:?nullTerminatedCString encoding: encoding];
returnAUTORELEASE(obj);
}
47. 關(guān)鍵字const有什么含意昂利?修飾類呢?static的作用,用于類呢?還有extern c的作用
const意味著"只讀"届腐,下面的聲明都是什么意思?
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
前兩個(gè)的作用是一樣蜂奸,a是一個(gè)常整型數(shù)犁苏。第三個(gè)意味著a是一個(gè)指向常整型數(shù)的指針(也就是,整型數(shù)是不可修改的扩所,但指針可以)围详。第四個(gè)意思a是一個(gè)指向整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是可以修改的祖屏,但指針是不可修改的)助赞。最后一個(gè)意味著a是一個(gè)指向常整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是不可修改的袁勺,同時(shí)指針也是不可修改的)雹食。
結(jié)論:·;關(guān)鍵字const的作用是為給讀你代碼的人傳達(dá)非常有用的信息,實(shí)際上期丰,聲明一個(gè)參數(shù)為常量是為了告訴了用戶這個(gè)參數(shù)的應(yīng)用目的群叶。如果 你曾花很多時(shí)間清理其它人留下的垃圾吃挑,你就會(huì)很快學(xué)會(huì)感謝這點(diǎn)多余的信息。(當(dāng)然街立,懂得用const的程序員很少會(huì)留下的垃圾讓別人來清 理的舶衬。)? ·; 通過給優(yōu)化器一些附加的信息,使用關(guān)鍵字const也許能產(chǎn)生更緊湊的代碼赎离。? ·; 合理地使用關(guān)鍵字const可以使編譯器很自然地保護(hù)那些不希望被改變的參數(shù)逛犹,防止其被無意的代碼修改。簡而言之梁剔,這樣可以減少bug的出現(xiàn)虽画。
(1)欲阻止一個(gè)變量被改變,可以使用 const 關(guān)鍵字憾朴。在定義該 const 變量時(shí)狸捕,通常需要對它進(jìn)行初 始化喷鸽,因?yàn)橐院缶蜎]有機(jī)會(huì)再去改變它了众雷;(2)對指針來說,可以指定指針本身為 const做祝,也可以指定指針?biāo)傅臄?shù)據(jù)為 const砾省,或二者同時(shí)指 定為 const;
(3)在一個(gè)函數(shù)聲明中混槐,const 可以修飾形參编兄,表明它是一個(gè)輸入?yún)?shù),在函數(shù)內(nèi)部不能改變其值声登; (4)對于類的成員函數(shù)狠鸳,若指定其為 const 類型,則表明其是一個(gè)常函數(shù)悯嗓,不能修改類的成員變量件舵; (5)對于類的成員函數(shù),有時(shí)候必須指定其返回值為 const 類型脯厨,以使得其返回值不為“左值”铅祸。
關(guān)鍵字volatile有什么含意?并給出三個(gè)不同的例子。一個(gè)定義為volatile的變量是說這變量可能會(huì)被意想不到地改變合武,這樣临梗,編譯器就不會(huì)去假設(shè)這個(gè)變量的值了。精確地說就是稼跳,優(yōu)化器在用到這個(gè)變量時(shí)必須每次都小心地重新讀取這個(gè)變量的值盟庞,而不是使用保存在寄存器里的備份。下面是volatile變量的幾個(gè)例子:
· ;并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器)
· ; 一個(gè)中斷服務(wù)子程序中會(huì)訪問到的非自動(dòng)變量(Non-automatic variables)
· ; 多線程應(yīng)用中被幾個(gè)任務(wù)共享的變量
· ;一個(gè)參數(shù)既可以是const還可以是volatile嗎汤善?解釋為什么茫经。
· ; 一個(gè)指針可以是volatile 嗎巷波?解釋為什么。
下面是答案:
· ; 是的卸伞。一個(gè)例子是只讀的狀態(tài)寄存器抹镊。它是volatile因?yàn)樗赡鼙灰庀氩坏降馗淖儭K莄onst因?yàn)槌绦虿粦?yīng)該試圖去修改它荤傲。
·; 是的垮耳。盡管這并不很常見。一個(gè)例子是當(dāng)一個(gè)中服務(wù)子程序修該一個(gè)指向一個(gè)buffer的指針時(shí)遂黍。
static關(guān)鍵字的作用:
(1)函數(shù)體內(nèi) static 變量的作用范圍為該函數(shù)體终佛,不同于 auto 變量,該變量的內(nèi)存只被分配一次雾家,因此其值在下次調(diào)用時(shí)仍維持上次的值铃彰; (2)在模塊內(nèi)的 static 全局變量可以被模塊內(nèi)所用函數(shù)訪問,但不能被模塊外其它函數(shù)訪問芯咧;
(3)在模塊內(nèi)的 static 函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用牙捉,這個(gè)函數(shù)的使用范圍被限制在聲明 它的模塊內(nèi);
(4)在類中的 static 成員變量屬于整個(gè)類所擁有敬飒,對類的所有對象只有一份拷貝邪铲;
(5)在類中的 static 成員函數(shù)屬于整個(gè)類所擁有,這個(gè)函數(shù)不接收 this 指針无拗,因而只能訪問類的static 成員變量带到。
extern "C"的作用:
(1)被 extern "C"限定的函數(shù)或變量是 extern 類型的;
extern是 C/C++語言中表明函數(shù)和全局變量作用范圍(可見性)的關(guān)鍵字英染,該關(guān)鍵字告訴編譯器揽惹,其聲明的函數(shù)和變量可以在本模塊或其它模塊中使用。
(2)被 extern "C"修飾的變量和函數(shù)是按照 C 語言方式編譯和連接的四康;
extern "C"的慣用法
(1)在 C++中引用 C 語言中的函數(shù)和變量搪搏,在包含 C 語言頭文件(假設(shè)為 cExample.h)時(shí),需進(jìn) 行下列處理:
extern "C"? {?#include "cExample.h"?? }
而在 C語言的頭文件中箭养,對其外部函數(shù)只能指定為 extern 類型慕嚷,C語言中不支持 extern "C"聲明, 在.c 文件中包含了 extern "C"時(shí)會(huì)出現(xiàn)編譯語法錯(cuò)誤毕泌。
(2)在 C 中引用 C++語言中的函數(shù)和變量時(shí)喝检,C++的頭文件需添加 extern "C",但是在 C 語言中不 能直接引用聲明了 extern "C"的該頭文件撼泛,應(yīng)該僅將 C 文件中將 C++中定義的extern "C"函數(shù)聲明為 extern 類型挠说。
48.為什么標(biāo)準(zhǔn)頭文件都有類似以下的結(jié)構(gòu)?
#ifndef __INCvxWorksh
#define __INCvxWorksh
#ifdef __cplusplus
extern "C" {
#endif???? /*...*/
#ifdef __cplusplus
}
#endif
#endif /* __INCvxWorksh */
顯然愿题,頭文件中的編譯宏“#ifndef __INCvxWorksh损俭、#define __INCvxWorksh蛙奖、#endif” 的作用是防止該頭文件被重復(fù)引用。
49. #import跟#include的區(qū)別,@class呢?
@class一般用于頭文件中需要聲明該類的某個(gè)實(shí)例變量的時(shí)候用到杆兵,在m文件中還是需要使用#import而#import比起#include的好處就是不會(huì)引起交叉編譯雁仲。
50.線程與進(jìn)程的區(qū)別和聯(lián)系?
答:進(jìn)程和線程都是由操作系統(tǒng)所體會(huì)的程序運(yùn)行的基本單元,系統(tǒng)利用該基本單元實(shí)現(xiàn)系統(tǒng)對應(yīng)用的并發(fā)性琐脏。
程和線程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式攒砖。
進(jìn)程有獨(dú)立的地址空間,一個(gè)進(jìn)程崩潰后日裙,在保護(hù)模式下不會(huì)對其它進(jìn)程產(chǎn)生影響吹艇,而線程只是一個(gè)進(jìn)程中的不同執(zhí)行路徑。
線程有自己的堆棧和局部變量昂拂,但線程之間沒有單獨(dú)的地址空間受神,一個(gè)線程死掉就等于整個(gè)進(jìn)程死掉,所以多進(jìn)程的程序要比多線程的程序健壯格侯,但在進(jìn)程切換時(shí)鼻听,耗費(fèi)資源較大,效率要差一些养交。但對于一些要求同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作精算,只能用線程瓢宦,不能用進(jìn)程碎连。
51.列舉幾種進(jìn)程的同步機(jī)制,并比較其優(yōu)缺點(diǎn)驮履。
答案:原子操作鱼辙、信號(hào)量機(jī)制、自旋鎖玫镐、管程倒戏、會(huì)合、分布式系統(tǒng)
進(jìn)程之間通信的途徑
答案:共享存儲(chǔ)系統(tǒng)消息傳遞系統(tǒng)管道:以文件系統(tǒng)為基礎(chǔ)
進(jìn)程死鎖的原因
答案:資源競爭及進(jìn)程推進(jìn)順序非法
死鎖的4個(gè)必要條件
答案:互斥恐似、請求保持杜跷、不可剝奪、環(huán)路
死鎖的處理
答案:鴕鳥策略矫夷、預(yù)防策略葛闷、避免策略、檢測與解除死鎖
52.什么是鍵-值,鍵路徑是什么
答:模型的性質(zhì)是通過一個(gè)簡單的鍵(通常是個(gè)字符串)來指定的双藕。視圖和控制器通過鍵來查找相應(yīng)的屬性值淑趾。在一個(gè)給定的實(shí)體中,同一個(gè)屬性的所有值具有相同的數(shù)據(jù)類型忧陪。鍵-值編碼技術(shù)用于進(jìn)行這樣的查找—它是一種間接訪問對象屬性的機(jī)制扣泊。
鍵路徑是一個(gè)由用點(diǎn)作分隔符的鍵組成的字符串近范,用于指定一個(gè)連接在一起的對象性質(zhì)序列。第一個(gè)鍵的性質(zhì)是由先前的性質(zhì)決定的延蟹,接下來每個(gè)鍵的值也是相對于其前面的性質(zhì)评矩。鍵路徑使您可以以獨(dú)立于模型實(shí)現(xiàn)的方式指定相關(guān)對象的性質(zhì)。通過鍵路徑阱飘,您可以指定對象圖中的一個(gè)任意深度的路徑稚照,使其指向相關(guān)對象的特定屬性。
For example, the keypath address.streetwould get the value of the address property from thereceivingobject, and then determine the street property relative to the addressobject.
53.c和obj-c如何混用
1)obj-c的編譯器處理后綴為m的文件時(shí)俯萌,可以識(shí)別obj-c和c的代碼果录,處理mm文件可以識(shí)別obj-c,c,c++代碼,但cpp文件必須只能用c/c++代碼咐熙,而且cpp文件include的頭文件中弱恒,也不能出現(xiàn)obj-c的代碼,因?yàn)閏pp只是cpp
2) 在mm文件中混用cpp直接使用即可棋恼,所以obj-c混cpp不是問題
3)在cpp中混用obj-c其實(shí)就是使用obj-c編寫的模塊是我們想要的返弹。 如果模塊以類實(shí)現(xiàn),那么要按照cpp class的標(biāo)準(zhǔn)寫類的定義爪飘,頭文件中不能出現(xiàn)obj-c的東西义起,包括#import cocoa的。實(shí)現(xiàn)文件中师崎,即類的實(shí)現(xiàn)代碼中可以使用obj-c的東西默终,可以import,只是后綴是mm。 如果模塊以函數(shù)實(shí)現(xiàn)犁罩,那么頭文件要按c的格式聲明函數(shù)齐蔽,實(shí)現(xiàn)文件中,c++函數(shù)內(nèi)部可以用obj-c床估,但后綴還是mm或m含滴。
總結(jié):只要cpp文件和cpp include的文件中不包含obj-c的東西就可以用了,cpp混用obj-c的關(guān)鍵是使用接口丐巫,而不能直接使用實(shí)現(xiàn)代碼谈况,實(shí)際上cpp混用的是obj-c編譯后的o文件,這個(gè)東西其實(shí)是無差別的递胧,所以可以用碑韵。obj-c的編譯器支持cpp.
54.目標(biāo)-動(dòng)作機(jī)制
答:目標(biāo)是動(dòng)作消息的接收者。一個(gè)控件谓着,或者更為常見的是它的單元泼诱,以插座變量(參見"插座變量"部分) 的形式保有其動(dòng)作消息的目標(biāo)。
動(dòng)作是控件發(fā)送給目標(biāo)的消息赊锚,或者從目標(biāo)的角度看治筒,它是目標(biāo)為了響應(yīng)動(dòng)作而實(shí)現(xiàn)的方法屉栓。程序需要某些機(jī)制來進(jìn)行事件和指令的翻譯。這個(gè)機(jī)制就是目標(biāo)-動(dòng)作機(jī)制耸袜。
55. cocoa touch框架
這些框架包括:
Core Animation
通過Core Animation友多,您就可以通過一個(gè)基于組合獨(dú)立圖層的簡單的編程模型來創(chuàng)建豐富的用戶體驗(yàn)。
Core Audio
Core Audio是播放堤框,處理和錄制音頻的專業(yè)技術(shù)域滥,能夠輕松為您的應(yīng)用程序添加強(qiáng)大的音頻功能。
Core Data提供了一個(gè)面向?qū)ο蟮臄?shù)據(jù)管理解決方案蜈抓,它易于使用和理解启绰,甚至可處理任何應(yīng)用或大或小的數(shù)據(jù)模型。
功能列表:框架分類
下面是 Cocoa Touch 中一小部分可用的框架:
音頻和視頻
CoreAudio
OpenAL
MediaLibrary
AVFoundation
數(shù)據(jù)管理
Core Data
SQLite
圖形和動(dòng)畫
CoreAnimation
OpenGL ES
Quartz 2D
網(wǎng)絡(luò)/li>
Bonjour
WebKit
BSDSockets
用戶應(yīng)用
AddressBook
CoreLocation
MapKit
StoreKit
56.objc的內(nèi)存管理
答:如果您通過分配和初始化(比如[[MyClass alloc] init])的方式來創(chuàng)建對象沟使,您就擁有這個(gè)對象委可,需要負(fù)責(zé)該對象的釋放。這個(gè)規(guī)則在使用NSObject的便利方法new 時(shí)也同樣適用腊嗡。
如果您拷貝一個(gè)對象着倾,您也擁有拷貝得到的對象,需要負(fù)責(zé)該對象的釋放燕少。如果您保持一個(gè)對象卡者,您就部分擁有這個(gè)對象,需要在不再使用時(shí)釋放該對象客们。反過來崇决,如果您從其它對象那里接收到一個(gè)對象,則您不擁有該對象镶摘,也不應(yīng)該釋放它(這個(gè)規(guī)則有少數(shù)的例外嗽桩,在參考文檔中有顯式的說明)岳守。
57.自動(dòng)釋放池是什么,如何工作凄敢?
答:當(dāng)您向一個(gè)對象發(fā)送一個(gè)autorelease消息時(shí),Cocoa就會(huì)將該對象的一個(gè)引用放入到最新的自動(dòng)釋放池湿痢。它仍然是個(gè)正當(dāng)?shù)膶ο罄苑欤虼俗詣?dòng)釋放池定義的作用域內(nèi)的其它對象可以向它發(fā)送消息。當(dāng)程序執(zhí)行到作用域結(jié)束的位置時(shí)譬重,自動(dòng)釋放池就會(huì)被釋放拒逮,池中的所有對象也就被釋放。
1)ojc-c是通過一種"referring counting"(引用計(jì)數(shù))的方式來管理內(nèi)存的, 對象在開始分配內(nèi)存(alloc)的時(shí)候引用計(jì)數(shù)為一,以后每當(dāng)碰到有copy,retain的時(shí)候引用計(jì)數(shù)都會(huì)加一, 每當(dāng)碰到release和autorelease的時(shí)候引用計(jì)數(shù)就會(huì)減一,如果此對象的計(jì)數(shù)變?yōu)榱?, 就會(huì)被系統(tǒng)銷毀.
2) NSAutoreleasePool就是用來做引用計(jì)數(shù)的管理工作的,這個(gè)東西一般不用你管的.
3)autorelease和release沒什么區(qū)別,只是引用計(jì)數(shù)減一的時(shí)機(jī)不同而已,autorelease會(huì)在對象的使用真正結(jié)束的時(shí)候才做引用計(jì)數(shù)減一臀规。
58.類工廠方法是什么滩援?
答:類工廠方法的實(shí)現(xiàn)是為了向客戶提供方便,它們將分配和初始化合在一個(gè)步驟中塔嬉,返回被創(chuàng)建的對象玩徊,并進(jìn)行自動(dòng)釋放處理租悄。這些方法的形式是+ (type)className...(其中 className不包括任何前綴)。工廠方法可能不僅僅為了方便使用恩袱。它們不但可以將分配和初始化合在一起泣棋,還可以為初始化過程提供對象的分配信息。類工廠方法的另一個(gè)目的是使類(比如NSWorkspace)提供單件實(shí)例畔塔。雖然init...方法可以確認(rèn)一 個(gè)類在每次程序運(yùn)行過程只存在一個(gè)實(shí)例潭辈,但它需要首先分配一個(gè)“生的”實(shí)例,然后還必須釋放該實(shí)例澈吨。工廠方法則可以避免為可能沒有用的對象盲目分配內(nèi)存把敢。
59. 單件實(shí)例是什么?
Foundation和Application Kit 框架中的一些類只允許創(chuàng)建單件對象谅辣,即這些類在當(dāng)前進(jìn)程中的唯一實(shí)例技竟。舉例來說劣针,NSFileManager和NSWorkspace 類在使用時(shí)都是基于進(jìn)程進(jìn)行單件對象的實(shí)例化髓堪。當(dāng)向這些類請求實(shí)例的時(shí)候,它們會(huì)向您傳遞單一實(shí)例的一個(gè)引用药有,如果該實(shí)例還不存在联逻,則首先進(jìn)行實(shí)例的分配和初始化搓扯。單件對象充當(dāng)控制中心的角色,負(fù)責(zé)指引或協(xié)調(diào)類的各種服務(wù)包归。如果類在概念上只有一個(gè)實(shí)例(比如NSWorkspace)锨推,就應(yīng)該產(chǎn)生一個(gè)單件實(shí)例,而不是多個(gè)實(shí)例公壤;如果將來某一天可能有多個(gè)實(shí)例换可,您可以使用單件實(shí)例機(jī)制,而不是工廠方法或函數(shù)厦幅。
60.動(dòng)態(tài)綁定
—在運(yùn)行時(shí)確定要調(diào)用的方法
動(dòng)態(tài)綁定將調(diào)用方法的確定也推遲到運(yùn)行時(shí)沾鳄。在編譯時(shí),方法的調(diào)用并不和代碼綁定在一起确憨,只有在消實(shí)發(fā)送出來之后译荞,才確定被調(diào)用的代碼。通過動(dòng)態(tài)類型和動(dòng)態(tài)綁定技術(shù)休弃,您的代碼每次執(zhí)行都可以得到不同的結(jié)果吞歼。運(yùn)行時(shí)因子負(fù)責(zé)確定消息的接收者和被調(diào)用的方法。運(yùn)行時(shí)的消息分發(fā)機(jī)制為動(dòng)態(tài)綁定提供支持塔猾。當(dāng)您向一個(gè)動(dòng)態(tài)類型確定了的對象發(fā)送消息時(shí)篙骡,運(yùn)行環(huán)境系統(tǒng)會(huì)通過接收者的isa指針定位對象的類,并以此為起點(diǎn)確定被調(diào)用的方法,方法和消息是動(dòng)態(tài)綁定的糯俗。而且慎皱,您不必在Objective-C 代碼中做任何工作,就可以自動(dòng)獲取動(dòng)態(tài)綁定的好處叶骨。您在每次發(fā)送消息時(shí)茫多,特別是當(dāng)消息的接收者是動(dòng)態(tài)類型已經(jīng)確定的對象時(shí),動(dòng)態(tài)綁定就會(huì)例行而透明地發(fā)生忽刽。
61.obj-c的優(yōu)缺點(diǎn)objc
優(yōu)點(diǎn):
1) Cateogies?? 2) Posing?? 3) 動(dòng)態(tài)識(shí)別?? 4) 指標(biāo)計(jì)算?? 5)彈性訊息傳遞?? 6) 不是一個(gè)過度復(fù)雜的 C 衍生語言?? 7) Objective-C 與 C++ 可混合編程
缺點(diǎn):
1) 不支援命名空間?? 2)? 不支持運(yùn)算符重載? 3) 不支持多重繼承? 4) 使用動(dòng)態(tài)運(yùn)行時(shí)類型天揖,所有的方法都是函數(shù)調(diào)用,所以很多編譯時(shí)優(yōu)化方法都用不到跪帝。(如內(nèi)聯(lián)函數(shù)等)今膊,性能低劣。
62.sprintf,strcpy,memcpy使用上有什么要注意的地方伞剑?
答:strcpy是一個(gè)字符串拷貝的函數(shù)斑唬,它的函數(shù)原型為strcpy(char *dst, const char *src);將src開始的一段字符串拷貝到dst開始的內(nèi)存中去,結(jié)束的標(biāo)志符號(hào)為'\0'黎泣,由于拷貝的長度不是由我們自己控制的恕刘,所以這個(gè)字符串拷貝很容易出錯(cuò)。
具備字符串拷貝功能的函數(shù)有memcpy抒倚,這是一個(gè)內(nèi)存拷貝函數(shù)褐着,它的函數(shù)原型為memcpy(char *dst,const char* src, unsigned int len);將長度為len的一段內(nèi)存,從src拷貝到dst中去托呕,這個(gè)函數(shù)的長度可控含蓉。但是會(huì)有內(nèi)存疊加的問題。
sprintf是格式化函數(shù)项郊。將一段數(shù)據(jù)通過特定的格式馅扣,格式化到一個(gè)字符串緩沖區(qū)中去。sprintf格式化的函數(shù)的長度不可控着降,有可能格式化后的字符串會(huì)超出緩沖區(qū)的大小差油,造成溢出。
.DS_Store (英文全稱 Desktop Services Store)是一種由蘋果公司的Mac OS X操作系統(tǒng)所創(chuàng)造的隱藏文件鹊碍,目的在于存貯文件夾的自定義屬性厌殉,例如文件們的圖標(biāo)位置或者是背景色的選擇等。
如何刪除Mac系統(tǒng)里面的所有 DS_Store 文件呢侈咕?
啟動(dòng)“終端”,再/應(yīng)用程序/工具文件夾中器紧。
輸入以下命令:
sudo find / -name ".DS_Store" -depth -exec rm {} \;
接著輸入你的管理員密碼耀销,這時(shí)你的 .DS_Store 全都沒了。
-----------------------------------------------------------------------------
Mac OS下不產(chǎn)生.DS_Store 隱藏文件
找程式砍 .DS_Store 很煩,直接讓它不要出現(xiàn)吧
其實(shí)這問題困擾我很久了熊尉,每個(gè)目錄裡面都會(huì)跑出一個(gè) .DS_Store 的檔案罐柳,我通常都是用
find /path/to -name 『.DS_Store』 -delete
來砍,不過砍了又會(huì)自動(dòng)再生狰住;顯然這問題不是只有困擾我而已张吉,都已經(jīng)有程式專門在解決類似的狀況。不過現(xiàn)在這問題得到了『終極的解決辦法』催植,有一篇文章提到了說要怎樣關(guān)掉這個(gè)功能:只要在命令列下這個(gè)指令然后重開機(jī)就可以啦
打開終端 - (shift + command + N)輸入下面的命令 然后重啟 OK
defaults write com.apple.desktopservices DSDontWriteNetworkStorestrue true
少了這個(gè)檔案會(huì)出什麼問題嗎 ? 根據(jù)他的說法肮蛹,這個(gè)檔案主要是用來儲(chǔ)存 『目錄是以何種型式顯示』的資訊,例如說打開的時(shí)候要放在螢?zāi)坏氖颤N地方啦创南、要用 small icon/big icon/list 的方式顯示之類伦忠;意思就是說,如果你不是很在意這些的話稿辙,應(yīng)該是可以大膽地把這個(gè)檔案給干掉
DS_Store 是 Finder 用來存儲(chǔ)這個(gè)文件夾的顯示屬性的:比如文件圖標(biāo)的擺放位置昆码。刪除以后的副作用就是這些信息的失去。(當(dāng)然邻储,這點(diǎn)副作用其實(shí)不是太大赋咽。
和別人交換文件(或你做的網(wǎng)頁需要上傳的時(shí)候)應(yīng)該把 .DS_Store 文件刪除比較妥當(dāng),因?yàn)槔锩姘艘恍┠悴灰欢ㄏM麆e人看見的信息(尤其是網(wǎng)站吨娜,通過 .DS_Store 可以知道這個(gè)目錄里面所有文件的清單冬耿,很多時(shí)候這是一個(gè)不希望出現(xiàn)的問題)。
OC -- language
CocoaTouch --Framework
Xcode -- IDE
Swift H5
項(xiàng)目經(jīng)驗(yàn)+處理問題能力和思路
oop四大特征:抽繼多封
多接口單繼承
類別(category分類)3個(gè)作用:
1.將類的實(shí)現(xiàn)分散到多個(gè)不同文件或多個(gè)不同框架
2.創(chuàng)建對私有方法的前向引用
3.向?qū)ο筇砑臃钦絽f(xié)議
基類 分類 調(diào)用
數(shù)據(jù)的裝箱與拆箱:對象--數(shù)據(jù)的基本類型
框架室一個(gè)單元的部件集合萌壳,包含頭文件亦镶,庫,圖像袱瓮,聲音文件等缤骨。Cocoa的組成部分有Foundation和ApplicationKit框架。還有一個(gè)支持框架的套件尺借,包含CoreAnimation和CoreImage绊起。
Foundation框架處理的是用戶界面之下的層(layer)中得到特性,例如數(shù)據(jù)結(jié)構(gòu)和通信機(jī)制燎斩。
MVC--ViewController虱歪,MVC模式在iOS SDK的實(shí)現(xiàn)。
NSThread直接創(chuàng)建兩種形式(實(shí)例栅表,類方法)笋鄙。多線程的淺復(fù)制(指向?qū)ο蟮闹羔槪瑫r(shí)修改)和深復(fù)制(引用對象本身怪瓶,兩份獨(dú)立)的區(qū)別萧落。
iOS程序的生命周期:未運(yùn)行、未激活、激活找岖、后臺(tái)陨倡、掛起。
對于閉包(block)的實(shí)現(xiàn)原理是基于指針和函數(shù)指針许布。
iOS6與iOS7的區(qū)別兴革,iOS8最大的特點(diǎn)。
OC的內(nèi)存管理3種方式:ARC(自動(dòng)內(nèi)存計(jì)數(shù))蜜唾、手動(dòng)內(nèi)存計(jì)數(shù)杂曲、內(nèi)存池。
IOS四種保存數(shù)據(jù)的方式:
1.NSKeyedArchiver(加密形式)
2.NSUserDefaults
3. Write寫入方式
4.SQLite3
線程與進(jìn)程的區(qū)別灵妨。
JSBinding:JS--Native的橋梁 CoCos2D解阅。
id聲明對象有什么特性?
id聲明的對象具有運(yùn)行時(shí)的特性泌霍,可以指向任意類型的OC對象货抄。
OC運(yùn)行時(shí)特性(runtime) -> #import
objC-getClass(), class_copyMethodList(), class_getInstanceMethod().
從代碼到可執(zhí)行文件有7步驟:
源代碼->預(yù)處理->編譯器->匯編器->機(jī)器碼->鏈接器->可執(zhí)行文件
Other Linker Flags -> ld + 參數(shù)
OC沒有命名空間,命名沖突-->使用長命名法或者特殊前綴解決朱转。如果引入第三方庫之間的命名沖突蟹地,可link命令和flag解決。
為什么會(huì)閃退藤为?
1.緩存垃圾過多怪与。
2.運(yùn)行程序過多。
3.應(yīng)用版本問題缅疟。
4.網(wǎng)速問題分别。
5.系統(tǒng)不兼容。
6.函數(shù)調(diào)用失敗存淫。
OC僅僅為類建立了符號(hào)表耘斩,并不會(huì)為每個(gè)方法建立符號(hào)表。如果靜態(tài)庫中定義了已存在的類的分類桅咆。鏈接器以為這個(gè)類已經(jīng)存在括授,不會(huì)把分類和核心類的代碼合起來。最后可執(zhí)行文件就會(huì)缺少分類里的類代碼岩饼,這樣函數(shù)調(diào)用就失敗荚虚。
實(shí)現(xiàn)過框架/庫供別人使用?有則談框架,講經(jīng)驗(yàn):無則談設(shè)想籍茧,講設(shè)計(jì)版述。
線程與進(jìn)程的區(qū)別和聯(lián)系?
進(jìn)程和線程都是由操作系統(tǒng)所體會(huì)的程序運(yùn)行的基本單元,系統(tǒng)利用該基本單元實(shí)現(xiàn)系統(tǒng)對應(yīng)用的并發(fā)性硕糊。
程和線程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式院水。進(jìn)程有獨(dú)立的地址空間腊徙,一個(gè)進(jìn)程崩潰后简十,在保護(hù)模式下不會(huì)對其它進(jìn)程產(chǎn)生影響檬某,而線程只是一個(gè)進(jìn)程中的不同執(zhí)行路徑。線程有自己的堆棧和局部變量螟蝙,但線程之間沒有單獨(dú)的地址空間恢恼,一個(gè)線程死掉就等于整個(gè)進(jìn)程死掉,所以多進(jìn)程的程序要比多線程的程序健壯胰默,但在進(jìn)程切換時(shí)场斑,耗費(fèi)資源較大,效率要差一些牵署。但對于一些要求同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作漏隐,只能用線程,不能用進(jìn)程奴迅。
Heap堆和Stack棧的區(qū)別
管理方式:對于棧來講青责,是由編譯器自動(dòng)管理,無需我們手工控制取具;對于堆來說脖隶,釋放工作由程序員控制,容易產(chǎn)生memory leak暇检。
申請大胁濉:
棧:在Windows下,棧是向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存的區(qū)域块仆。這句話的意思是棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的构蹬,在 WINDOWS下,棧的大小是2M(也有的說是1M悔据,總之是一個(gè)編譯時(shí)就確定的常數(shù))庄敛,如果申請的空間超過棧的剩余空間時(shí),將提示overflow蜜暑。因此铐姚,能從棧獲得的空間較小。
堆:堆是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu)肛捍,是不連續(xù)的內(nèi)存區(qū)域隐绵。這是由于系統(tǒng)是用鏈表來存儲(chǔ)的空閑內(nèi)存地址的,自然是不連續(xù)的拙毫,而鏈表的遍歷方向是由低地址向高地址依许。堆的大小受限于計(jì)算機(jī)系統(tǒng)中有效的虛擬內(nèi)存。由此可見缀蹄,堆獲得的空間比較靈活峭跳,也比較大膘婶。
碎片問題:對于堆來講,頻繁的new/delete勢必會(huì)造成內(nèi)存空間的不連續(xù)蛀醉,從而造成大量的碎片悬襟,使程序效率降低。對于棧來講拯刁,則不會(huì)存在這個(gè)問題脊岳,因?yàn)闂J窍冗M(jìn)后出的隊(duì)列,他們是如此的一一對應(yīng)垛玻,以至于永遠(yuǎn)都不可能有一個(gè)內(nèi)存塊從棧中間彈出
分配方式:堆都是動(dòng)態(tài)分配的割捅,沒有靜態(tài)分配的堆。棧有2種分配方式:靜態(tài)分配和動(dòng)態(tài)分配帚桩。靜態(tài)分配是編譯器完成的亿驾,比如局部變量的分配。動(dòng)態(tài)分配由alloca函數(shù)進(jìn)行分配账嚎,但是棧的動(dòng)態(tài)分配和堆是不同的莫瞬,他的動(dòng)態(tài)分配是由編譯器進(jìn)行釋放,無需我們手工實(shí)現(xiàn)醉锄。
分配效率:棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu)乏悄,計(jì)算機(jī)會(huì)在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執(zhí)行恳不,這就決定了棧的效率比較高檩小。堆則是C/C++函數(shù)庫提供的,它的機(jī)制是很復(fù)雜的烟勋。
socket連接和http連接的區(qū)別
簡單說规求,你瀏覽的網(wǎng)頁(網(wǎng)址以http://開頭)都是http協(xié)議傳輸?shù)侥愕臑g覽器的, 而http是基于socket之上的。socket是一套完成tcp卵惦,udp協(xié)議的接口阻肿。
HTTP協(xié)議:簡單對象訪問協(xié)議,對應(yīng)于應(yīng)用層 沮尿,HTTP協(xié)議是基于TCP連接的
tcp協(xié)議: 對應(yīng)于傳輸層
ip協(xié)議: 對應(yīng)于網(wǎng)絡(luò)層
TCP/IP是傳輸層協(xié)議丛塌,主要解決數(shù)據(jù)如何在網(wǎng)絡(luò)中傳輸;而HTTP是應(yīng)用層協(xié)議畜疾,主要解決如何包裝數(shù)據(jù)赴邻。
Socket是對TCP/IP協(xié)議的封裝,Socket本身并不是協(xié)議啡捶,而是一個(gè)調(diào)用接口(API)姥敛,通過Socket,我們才能使用TCP/IP協(xié)議瞎暑。
http連接:http連接就是所謂的短連接彤敛,即客戶端向服務(wù)器端發(fā)送一次請求与帆,服務(wù)器端響應(yīng)后連接即會(huì)斷掉;
socket連接:socket連接就是所謂的長連接墨榄,理論上客戶端和服務(wù)器端一旦建立起連接將不會(huì)主動(dòng)斷掉玄糟;但是由于各種環(huán)境因素可能會(huì)是連接斷開,比如說:服務(wù)器端或客戶端主機(jī)down了渠概,網(wǎng)絡(luò)故障茶凳,或者兩者之間長時(shí)間沒有數(shù)據(jù)傳輸嫂拴,網(wǎng)絡(luò)防火墻可能會(huì)斷開該連接以釋放網(wǎng)絡(luò)資源播揪。所以當(dāng)一個(gè)socket連接中沒有數(shù)據(jù)的傳輸,那么為了維持連接需要發(fā)送心跳消息~~具體心跳消息格式是開發(fā)者自己定義的
我們已經(jīng)知道網(wǎng)絡(luò)中的進(jìn)程是通過socket來通信的筒狠,那什么是socket呢猪狈?socket起源于Unix,而Unix/Linux基本哲學(xué)之一就是“一切皆文件”辩恼,都可以用“打開open –> 讀寫write/read –> 關(guān)閉close”模式來操作雇庙。我的理解就是Socket就是該模式的一個(gè)實(shí)現(xiàn),socket即是一種特殊的文件灶伊,一些socket函數(shù)就是對其進(jìn)行的操作(讀/寫IO疆前、打開、關(guān)閉)聘萨,這些函數(shù)我們在后面進(jìn)行介紹竹椒。我們在傳輸數(shù)據(jù)時(shí),可以只使用(傳輸層)TCP/IP協(xié)議米辐,但是那樣的話胸完,如果沒有應(yīng)用層,便無法識(shí)別數(shù)據(jù)內(nèi)容翘贮,如果想要使傳輸?shù)臄?shù)據(jù)有意義赊窥,則必須使用到應(yīng)用層協(xié)議,應(yīng)用層協(xié)議有很多狸页,比如HTTP锨能、FTP、TELNET等芍耘,也可以自己定義應(yīng)用層協(xié)議址遇。WEB使用HTTP協(xié)議作應(yīng)用層協(xié)議,以封裝HTTP文本信息齿穗,然后使用TCP/IP做傳輸層協(xié)議將它發(fā)到網(wǎng)絡(luò)上傲隶。
1)Socket是一個(gè)針對TCP和UDP編程的接口,你可以借助它建立TCP連接等等窃页。而TCP和UDP協(xié)議屬于傳輸層 跺株。
而http是個(gè)應(yīng)用層的協(xié)議复濒,它實(shí)際上也建立在TCP協(xié)議之上。
(HTTP是轎車乒省,提供了封裝或者顯示數(shù)據(jù)的具體形式巧颈;Socket是發(fā)動(dòng)機(jī),提供了網(wǎng)絡(luò)通信的能力袖扛。)
2)Socket是對TCP/IP協(xié)議的封裝砸泛,Socket本身并不是協(xié)議,而是一個(gè)調(diào)用接口(API)蛆封,通過Socket唇礁,我們才能使用TCP/IP協(xié)議。Socket的出現(xiàn)只是使得程序員更方便地使用TCP/IP協(xié)議棧而已惨篱,是對TCP/IP協(xié)議的抽象盏筐,從而形成了我們知道的一些最基本的函數(shù)接口。
TCP/UDP區(qū)別聯(lián)系
TCP---傳輸控制協(xié)議,提供的是面向連接砸讳、可靠的字節(jié)流服務(wù)琢融。當(dāng)客戶和服務(wù)器彼此交換數(shù)據(jù)前,必須先在雙方之間建立一個(gè)TCP連接簿寂,之后才能傳輸數(shù)據(jù)漾抬。TCP提供超時(shí)重發(fā),丟棄重復(fù)數(shù)據(jù)常遂,檢驗(yàn)數(shù)據(jù)纳令,流量控制等功能,保證數(shù)據(jù)能從一端傳到另一端烈钞。
UDP---用戶數(shù)據(jù)報(bào)協(xié)議泊碑,是一個(gè)簡單的面向數(shù)據(jù)報(bào)的運(yùn)輸層協(xié)議。UDP不提供可靠性毯欣,它只是把應(yīng)用程序傳給IP層的數(shù)據(jù)報(bào)發(fā)送出去馒过,但是并不能保證它們能到達(dá)目的地。由于UDP在傳輸數(shù)據(jù)報(bào)前不用在客戶和服務(wù)器之間建立一個(gè)連接酗钞,且沒有超時(shí)重發(fā)等機(jī)制腹忽,故而傳輸速度很快
TCP(Transmission Control Protocol,傳輸控制協(xié)議)是基于連接的協(xié)議砚作,也就是說窘奏,在正式收發(fā)數(shù)據(jù)前,必須和對方建立可靠的連接葫录。一個(gè)TCP連接必須要經(jīng)過三次“對話”才能建立起來着裹,我們來看看這三次對話的簡單過程:1.主機(jī)A向主機(jī)B發(fā)出連接請求數(shù)據(jù)包;2.主機(jī)B向主機(jī)A發(fā)送同意連接和要求同步(同步就是兩臺(tái)主機(jī)一個(gè)在發(fā)送米同,一個(gè)在接收骇扇,協(xié)調(diào)工作)的數(shù)據(jù)包摔竿;3.主機(jī)A再發(fā)出一個(gè)數(shù)據(jù)包確認(rèn)主機(jī)B的要求同步:“我現(xiàn)在就發(fā),你接著吧少孝!”继低,這是第三次對話。三次“對話”的目的是使數(shù)據(jù)包的發(fā)送和接收同步稍走,經(jīng)過三次“對話”之后袁翁,主機(jī)A才向主機(jī)B正式發(fā)送數(shù)據(jù)。
UDP(User Data Protocol婿脸,用戶數(shù)據(jù)報(bào)協(xié)議)是與TCP相對應(yīng)的協(xié)議粱胜。它是面向非連接的協(xié)議,它不與對方建立連接盖淡,而是直接就把數(shù)據(jù)包發(fā)送過去年柠! UDP適用于一次只傳送少量數(shù)據(jù)、對可靠性要求不高的應(yīng)用環(huán)境褪迟。
tcp協(xié)議和udp協(xié)議的差別
是否連接面向連接面向非連接
傳輸可靠性可靠不可靠
應(yīng)用場合傳輸大量數(shù)據(jù)少量數(shù)據(jù)
速度慢快
什么是KVC和KVO?答:KVC(Key-Value-Coding)內(nèi)部的實(shí)現(xiàn):一個(gè)對象在調(diào)用setValue的時(shí)候答憔,(1)首先根據(jù)方法名找到運(yùn)行方法的時(shí)候所需要的環(huán)境參數(shù)味赃。(2)他會(huì)從自己isa指針結(jié)合環(huán)境參數(shù),找到具體的方法實(shí)現(xiàn)的接口虐拓。(3)再直接查找得來的具體的方法實(shí)現(xiàn)心俗。KVO(Key-Value- Observing):當(dāng)觀察者為一個(gè)對象的屬性進(jìn)行了注冊,被觀察對象的isa指針被修改的時(shí)候蓉驹,isa指針就會(huì)指向一個(gè)中間類城榛,而不是真實(shí)的類。所以 isa指針其實(shí)不需要指向?qū)嵗龑ο笳鎸?shí)的類态兴。所以我們的程序最好不要依賴于isa指針狠持。在調(diào)用類的方法的時(shí)候,最好要明確對象實(shí)例的類名瞻润。
obj-c的優(yōu)缺點(diǎn)
objc優(yōu)點(diǎn):
1) Cateogies
2) Posing
3) 動(dòng)態(tài)識(shí)別
4) 指標(biāo)計(jì)算
5)彈性訊息傳遞
6) 不是一個(gè)過度復(fù)雜的 C 衍生語言
7) Objective-C 與 C++ 可混合編程
缺點(diǎn):
1) 不支援命名空間
2) 不支持運(yùn)算符重載
3)不支持多重繼承
4)使用動(dòng)態(tài)運(yùn)行時(shí)類型喘垂,所有的方法都是函數(shù)調(diào)用,所以很多編譯時(shí)優(yōu)化方法都用不到绍撞。(如內(nèi)聯(lián)函數(shù)等)正勒,性能低劣。
確保你對Objective-C 2.0的特性都非常熟悉傻铣≌抡辏可以猜的到會(huì)有一些關(guān)于通知(messaging),協(xié)議(protocols)非洲,動(dòng)態(tài)類型(dynamic types)鸭限,轉(zhuǎn)發(fā)(forwarding)就谜,分類(categories),posing, method swizzling等方面的問題里覆。
假設(shè)有三個(gè)對象丧荐,一個(gè)父類的父類,一個(gè)父類和一個(gè)子類喧枷。父類的父類持有父類的引用(retain)虹统,父類持有子類的引用(retain),子類持有父類的引用(retain)隧甚。父類的父類釋放(release)父類车荔,解釋下會(huì)發(fā)生什么。 -——即使有ARC戚扳,我依然喜歡問一些內(nèi)存相關(guān)的問題忧便,這顯示了這個(gè)人有一定時(shí)間的開發(fā)經(jīng)驗(yàn),而且明白核心的框架是如何運(yùn)作的帽借。
當(dāng)一個(gè)空指針(nil pointer)調(diào)用了一個(gè)方法會(huì)發(fā)生什么珠增?——了解處理基礎(chǔ)的Objective-C相關(guān)問題是很重要的,有好多次我都聽到了錯(cuò)誤的回答砍艾,這很令我震驚蒂教。
為什么retainCount絕對不能用在發(fā)布的代碼中?請給出兩個(gè)相對獨(dú)立的解釋脆荷∧猓—— 考察這個(gè)問題會(huì)有兩個(gè)好處:一是可以確定面試者目前確實(shí)沒有使用retainCount,并且看看他們是否知道為什么他們不應(yīng)該使用蜓谋。
請說明一下你查找或者解決內(nèi)存泄露的處理過程梦皮。這個(gè)可以深入了解面試者對內(nèi)存管理方面的知識(shí),instruments的運(yùn)用及其調(diào)試的處理過程桃焕〗?希——有時(shí)候我會(huì)聽到一些可怕的回答:“注釋掉部分代碼直到內(nèi)存泄露問題被修復(fù)”。
解釋下自動(dòng)回收池(autorelease pool)在程序運(yùn)行時(shí)是如何運(yùn)作的覆旭。 -——這類型的問題已經(jīng)超出代碼基礎(chǔ)了退子,一個(gè)程序員只有閱讀過一部分開發(fā)類書籍才能學(xué)到這些內(nèi)容。這些問題也同樣能考察他對程序底層代碼運(yùn)作的了解程度型将。
當(dāng)處理屬性申明的時(shí)候寂祥,原子(atomic)跟 非原子(non-atomic)屬性有什么區(qū)別?-——好多人都不知道這個(gè)問題的答案七兜,我又一次震驚了丸凭。很多人他們都是看別人是怎么聲明的,他們就怎么來聲明。類似這種的題目會(huì)暴漏出來很多問題惜犀。
在C語言中铛碑,你如何能用盡可能短的時(shí)間來倒轉(zhuǎn)一個(gè)字符串?—— 我不大喜歡深入問計(jì)算機(jī)的核心內(nèi)容虽界, 但是通過這個(gè)問題可以讓我了解到他們是如何思考的汽烦,同樣也可以了解到他們的C語言背景。深入詢問時(shí)間復(fù)雜度(big O notation)也能讓我了解面試者的水平莉御。
遍歷一個(gè)NSArray和一個(gè)NSSet撇吞,哪一個(gè)更快? ——另一個(gè)深入的提問礁叔。有時(shí)候一個(gè)類解決了問題并不能代表你就應(yīng)該用這個(gè)類牍颈。
解釋代碼簽名(code signing)是如何運(yùn)作的。 —— 很多候選人都完全不了解代碼簽名是如何運(yùn)作的琅关,然后抱怨說他們一直被一些代碼簽名的一些問題所困擾煮岁。
Objective-C中的posing指的是什么? —— Posing是一個(gè)Object-C的小眾語法特性涣易。像 swizzling那個(gè)問題一樣画机,這個(gè)問題可以讓我了解面試者對語言的深入程度。
列舉標(biāo)準(zhǔn)Xcode版本中的6個(gè)工具。 —— 通過這個(gè)問題我可以大致的了解到面試者會(huì)在這些工具上花費(fèi)多少時(shí)間。提示:至少得用10%的寫代碼的時(shí)間來用這些工具真仲。
copy跟retain有什么區(qū)別阱缓? —— 最近好多開發(fā)者都開始用ARC了,內(nèi)存方面的問題就更能反映出一個(gè)開發(fā)者的知識(shí)水平了金抡。
frames跟bounds有哪些區(qū)別瀑焦? -——我不會(huì)問很多界面相關(guān) (GUI-type)的問題,我應(yīng)該問的多一些梗肝,不過通過這個(gè)問題我差不多能了解到一個(gè)開發(fā)者做了多少界面工作榛瓮。