如果要給一個(gè)屬性不一樣的訪問方法拣挪,需要在property里進(jìn)行指定牺六,如下:
@property(getter = isFinished) BOOL finished;可以自定義變量名字走趋,需要定義跳轉(zhuǎn)的值称簿,如下:
@implementation class
@sythesize propertyName = instanceVarivalbeName
….
@end一定要保證weak屬性在被調(diào)用之前不為nil,比如:
if(self.weakProperty) {….}Unsafe Unretained: 有些不支持weak的屬性,比如NSTextView,NSFont和NSColorSpace等,使用方法如下:
@property (unsafe_unretained) NSObject *unsafeProperty;
NSObject *__unsafe_unretained unsafeReference;
unsafe 引用 和weak引用類似胚膊,但是他在目標(biāo)對(duì)象為nil時(shí)不會(huì)被置為nil。所以有可能存在野指針的情況奈应。處理兩個(gè)對(duì)象時(shí)澜掩,==操作符表示測(cè)試兩個(gè)不同指針是否指向同一個(gè)對(duì)象购披;
如果要測(cè)試兩個(gè)對(duì)象是否含有同樣的值杖挣,應(yīng)當(dāng)使用 isEqual方法。在運(yùn)行時(shí)刚陡,通過category添加的方法和通過原始class添加的方法沒有區(qū)別惩妇。
除了可以給現(xiàn)有class添加方法,category也可以用來分割復(fù)雜class的各種實(shí)現(xiàn)筐乳。
如果一個(gè)在category里定義的方法名和原始class或者另一個(gè)category中定義的方法名一樣歌殃,那么運(yùn)行時(shí)執(zhí)行哪一個(gè)方法名的方法就不一定了。
為了防止未定義的行為蝙云,最佳實(shí)踐是給方法名添加前綴氓皱。
extension和category功能類似,但是extension只可以給已知源碼的class添加方法。
class extension經(jīng)常用來給public class添加private方法或者屬性波材。 例如股淡,定義一個(gè)屬性為readonly在外部,但是內(nèi)部定義該屬性為readwrite廷区,為了內(nèi)部能直接改變屬性值唯灵。
和class extension不同,associated reference 不影響原始class的定義和實(shí)現(xiàn)隙轻,所以說即便沒有對(duì)原始數(shù)據(jù)的訪問權(quán)限埠帕,也可以使用。
objc_setAssociatedObjectNSArray和NSDictionary只可以用來收集OC對(duì)象玖绿,其它對(duì)象必須封裝在OC對(duì)象之內(nèi)才可以init到上述類型之中敛瓷。
NSNumber是一個(gè)類簇。意思是當(dāng)你在運(yùn)行時(shí)創(chuàng)建一個(gè)實(shí)例時(shí)斑匪,你會(huì)得到一個(gè)具體的子類來存儲(chǔ)提供的值琐驴,就當(dāng)那個(gè)對(duì)象是NSNumber的子類就好。
在sort的時(shí)候:
a) NSArray類型由于是不可變秤标,所以調(diào)用sort方法會(huì)返回一個(gè)新的array對(duì)象绝淡。
b) Mutable的Array可以直接sort,不需要返回新array如果在collection中想表達(dá)”no object”苍姜,可以使用NSNull類
很多collection類實(shí)現(xiàn)了NSFastEnumeration協(xié)議牢酵,包括NSArray,NSSet和NSDictionary衙猪。
在快速遍歷collection時(shí)是不可以修改值的馍乙,即便是mutable的變量。如果你打算add或者remove一個(gè)對(duì)象垫释,會(huì)導(dǎo)致一個(gè)運(yùn)行時(shí)異常丝格。
通過反復(fù)調(diào)用nextObject也可以遍歷所有內(nèi)容,比如:
while((eachObject = [enumerator nextObject])){……}如果真的想在條件處賦值棵譬,則需要將賦值語句加括號(hào)显蝌,比如:
if((someVar = YES))用快速遍歷比手工用遍歷對(duì)象要快。
如果在block之后修改了block內(nèi)部讀取的值订咸,因?yàn)樵撝当籧apture了曼尊,所以在block生效時(shí)不會(huì)收影響。比如:
int value = 42;
void (^testBlock)(void) = ^{ NSLog(“%d”,value);}//print 42 while ext
value = 84;
testBlock();如果想改變block中的引用值脏嚷,需要用__block標(biāo)志骆撇。這時(shí)候該值的生命周期在block內(nèi)外都是有效的。
__block int value = 42;
void (^testBlock)(void) = ^{ NSLog(“%d”,value);}//print 84 while ext
value = 84;
testBlock();block類型應(yīng)當(dāng)設(shè)置其類型為copy父叙,因?yàn)閎lock需要copy以保證保持原始調(diào)用域的環(huán)境神郊。不過在ARC下不需要考慮這個(gè)問題肴裙,因?yàn)閎lock自動(dòng)會(huì)以copy形式定義。
下述方法遍歷每一個(gè)鍵值對(duì)更加方便:
NSDictionary *dict = …
[dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj,BOOL *stop)
{
NSLog(“key:%@,value:%@”,key,object);
}創(chuàng)建NSError時(shí)涌乳,需要定義自己的errorDomain践宴,應(yīng)該形式如下:
com.companyName.appOrFrameworkName.ErrorDomain
創(chuàng)建完整的Error如下:
NSString *domain = @”com.MyCompany.MyApplication.ErrorDomain”;
NSString *desc = NSLocalizedString(@”Unable to…”,@””);
NSDictionary *userInfo = @{NSLocalizedDescriptionKey:desc};
NSError *error = [NSError errorWithDomain:domain code:-101 userInfo:userInfo];自定義類應(yīng)當(dāng)使用三個(gè)字母的前綴。命名最好用名詞爷怀,以表示所指阻肩,例如:NSWindow, CAAnimation等
如果method需要一個(gè)或多個(gè)參數(shù),方法名需要暗示出每一個(gè)參數(shù)运授,比如:
subStringFromIndex: writeToUrl:方法名的第一部分應(yīng)當(dāng)暗示方法的主要意圖或者方法的返回值烤惊。如果返回值很重要,可以用復(fù)合詞吁朦,比如mutableCopy. 如果一個(gè)方法返回一個(gè)action柒室,第一個(gè)單詞應(yīng)當(dāng)暗示那個(gè)action,例如write…或者enumerate…
如果一個(gè)方法需要傳入error參數(shù)逗宜,此參數(shù)應(yīng)該排在最后雄右;如果一個(gè)方法含有block,block應(yīng)當(dāng)排在最后纺讲,為了使得方法名在調(diào)用時(shí)盡量處于統(tǒng)一行擂仍,方便可讀。因此盡量在方法中少包含block變量熬甚。
少寫縮寫逢渔。
工廠類方法在創(chuàng)建時(shí)應(yīng)當(dāng)以類名字作為開頭(無前綴),除非類的子類存在相同的工廠方法了乡括。例如 [NSMutableArray array];
只要見到mutable就是深拷貝肃廓。
列表:
[immutableObject copy]//淺copy
[immutableObject mutableCopy]//單層深copy
[mutableObject copy]//單層深copy
[mutableObject mutableCopy]//單層深copy