OC中的類簇的使用和初始化方法中屬性的使用-創(chuàng)新互聯(lián)

今天遇到了幾個(gè)和字符串相關(guān)的內(nèi)存問(wèn)題,和大家分享一下

創(chuàng)新互聯(lián)公司長(zhǎng)期為上1000家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為椒江企業(yè)提供專業(yè)的做網(wǎng)站、網(wǎng)站設(shè)計(jì)椒江網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

NSString *name = [[NSString alloc]initWithString:@"張三"];
NSLog(@"%d",[name retainCount]);

這兩行代碼的打印結(jié)果是-1,

NSString * aString = [[NSString alloc] initWithFormat:@"123"];
NSLog(@"%d",aString.retainCount);

這兩行代碼的打印結(jié)果也是-1

NSString * aString = [[NSString alloc] initWithFormat:@"1233sfsf4545f"];
NSLog(@"%d",aString.retainCount);

當(dāng)就字符串變?yōu)樯厦嫠鰰r(shí),打印結(jié)果變?yōu)榱?

這就奇怪了,為什么相同的語(yǔ)法打印的結(jié)果會(huì)是不同呢?反過(guò)來(lái)分析,打印結(jié)果是-1說(shuō)明引用指向的是常量區(qū)的字符串,打印結(jié)果是1指向的是堆區(qū)的字符串。由于OC是不開源的,內(nèi)部的實(shí)現(xiàn)我們不得而知,但是從中我們至少可以猜測(cè),OC中對(duì)不同大小的字符串是由不同的方法的。

initWithString產(chǎn)生的是將指針指向了常量區(qū)的字符串,是無(wú)法被release的,如果使用dealloc進(jìn)行摧毀會(huì)報(bào)錯(cuò)。其一:不能手動(dòng)調(diào)用dealloc方法 再者蘋果官方文檔中說(shuō)的很清楚,創(chuàng)建的對(duì)象和retain的對(duì)象為自己所保有,這些對(duì)象全部都是在堆區(qū)的。靜態(tài)區(qū)的內(nèi)存實(shí)在編譯時(shí)就分配好了的,它的內(nèi)存地址非??壳?,而且在程序運(yùn)行的整個(gè)階段都存在,所以我們不能釋放。

關(guān)于類簇(class cluster)大家舉得最多的例子就是NSNumber類,其實(shí)NSNumber類是一個(gè)抽象的超類,內(nèi)部有很多的具體的子類,如NSInt NSDouble等,它們對(duì)應(yīng)不同的初始化方法,也就是說(shuō)NSNumber的不同初始化方法返回的類型是不同的。不僅NSNumber,NSString也是如此,

// 類簇的使用
  id someClass = [NSString alloc]; // 返回的對(duì)象類型:NSPlaceholderString

  NSString *string1 = [[NSString alloc] init]; // 返回的對(duì)象類型:__NSCFConstantString
  NSString *string2 = [[NSString alloc] initWithFormat:@"string2"]; // 返回的對(duì)象類型:__NSCFString
  NSLog(@"%@", string1);
  NSLog(@"%@", string2);

類簇可以簡(jiǎn)化一個(gè)面向?qū)ο蟮墓_架構(gòu),而又不減少功能的豐富性

我們?cè)陧?xiàng)目中肯定會(huì)遇到類的初始化方法傳參的情況,如果實(shí)在MRC模式下,如何保證內(nèi)存不leak,蘋果的官方文檔做了如下推薦

- (id)initWithName:(NSString*)name{

   self = [super init];

      if(self){

           _name = [name copy];// 當(dāng)然name屬性的語(yǔ)義控制要使用copy

       }

       return self;

}

使用self.name = name;其實(shí)和上面是相同的

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國(guó)云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開啟,新人活動(dòng)云服務(wù)器買多久送多久。

新聞標(biāo)題:OC中的類簇的使用和初始化方法中屬性的使用-創(chuàng)新互聯(lián)
URL分享:http://bm7419.com/article24/cedeje.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)建站公司、服務(wù)器托管、面包屑導(dǎo)航、品牌網(wǎng)站建設(shè)、定制網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化