使用ARC時(shí)必須遵循的方法命名規(guī)則
將內(nèi)存管理語(yǔ)義在方法名中表示出來(lái)早已成為Objective-C的慣例,而ARC則將之確立為硬性規(guī)定。這些規(guī)則簡(jiǎn)單地體現(xiàn)在方法名上。若方法名以下詞語(yǔ)開(kāi)頭,則將其返回的對(duì)象歸調(diào)用者所有:
alloc
new
copy
mutableCopy
歸調(diào)用者所有的意思是:調(diào)用上述四種方法的那段代碼要負(fù)責(zé)釋放方法所返回的對(duì)象。
若方法名不以上述4個(gè)詞語(yǔ)開(kāi)頭,則表示所返回的對(duì)象不歸調(diào)用者所擁有。在這種情況下,返回的對(duì)象會(huì)自動(dòng)釋放,所以其值在跨越方法調(diào)用邊界后依然后效。要想使對(duì)象多存活一段時(shí)間,必須令調(diào)用者保留它才行。維系這些所需的全部?jī)?nèi)存管理均有ARC自動(dòng)處理。
(EOCPerson )newPerson
{
EOCPerson person = [[EOCPerson alloc] init];
return person;
/
The method name begins with 'new' and since 'person' already has an unbalanced +1 retain count from the alloc, no retains, releases, or autoreleases are required when returning
**/
}(EOCPerson )somePerson
{
EOCPerson person = [[EOCPerson alloc] init];
return person;
/
The method name does not begin with one of the "owning" prefiexes, therefore ARC will add an autorelease when return 'person'
**/
}
- (void)doSomething
{
EOCPerson personOne = [EOCPerson newPerson];
EOCPerson personTwo = [EOCPerson otherPerson];
/
At the point , 'personOne' and 'personTwo' go out of scope , therefore ARC needs to clean them up as required .
----'personOne' was returned as owned by this block of code, so ti needs to be released
----'personTwo' was not returned as owned by this block of code, so does not need to be released
}
ARC通過(guò)命名約定將內(nèi)存管理規(guī)定標(biāo)準(zhǔn)化。
變量的內(nèi)存管理的語(yǔ)義:
ARC也會(huì)處理局部變量與實(shí)例變量的內(nèi)存管理。默認(rèn)的情況下,每個(gè)變量都是指向?qū)ο蟮膹?qiáng)引用。
我們經(jīng)常會(huì)給局部變量加上__weak修飾符,用以打破由“塊”所引入的保留環(huán)