偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

蘋果開發(fā)教程 Cocoa內(nèi)存管理筆記

移動(dòng)開發(fā) iOS
本文介紹的是蘋果開發(fā)教程 Cocoa內(nèi)存管理筆記,很詳細(xì)的介紹了對(duì)內(nèi)存的管理,如何管理,我們來看內(nèi)容。

蘋果開發(fā)教程 Cocoa內(nèi)存管理筆記是本文要介紹的內(nèi)容,內(nèi)容分為兩種方式進(jìn)行介紹,我們來看詳細(xì)內(nèi)容。

下面的這種方式是不對(duì)的

  1. Instance you don’t own is sent release- (void)reset {NSNumber *zero = [NSNumber numberWithInteger:0]; 

創(chuàng)建的是一個(gè)autorelease的對(duì)象[self setCount:zero];[zero release];//這里釋放是危險(xiǎn)的}

  1. When you add an object to a collection such as an array, dictionary, or set, the collection takes ownership of 

it.在集合中增加object,那么這個(gè)object的所有者就變成了集合了

代碼

  1. // ...for (i = 0; i < 10; i++) {NSNumber *convenienceNumber = [NSNumber numberWithInteger:i];  
  2. [array addObject:convenienceNumber];  
  3. }  
  4. //這種情況不需要releaseNSMutableArray *array;NSUInteger i;  
  5. // ...for (i = 0; i < 10; i++) {NSNumber *allocedNumber = [[NSNumber alloc] initWithInteger: i]  
  6. ;[array addObject:allocedNumber];[allocedNumber release];}  
  7. //這種情況需要,此處只是將retain的計(jì)數(shù)減1而已 

安全返回對(duì)象

下面兩種方式是正確的

  1. (NSString *)fullName {    
  2.  NSString *string = [NSString stringWithFormat:@"%@ %@", firstName, lastName];    
  3.  return string;    
  4.  }    
  5.      
  6.  (NSString *)fullName {    
  7.  NSString *string = [[[NSString alloc] initWithFormat:@"%@ %@", firstName,    
  8.  lastName] autorelease];    
  9.  return string;    
  10.  }  

相反,下面的方式是錯(cuò)誤的

  1.  (NSString *)fullName {    
  2.  NSString *string = [[[NSString alloc] initWithFormat:@"%@ %@", firstName,    
  3.  lastName] release];    
  4.  return string;    
  5. }   

8 同樣,下面的方式也是錯(cuò)的

  1. (NSString *)fullName {    
  2. NSString *string = [[NSString alloc] initWithFormat:@"%@ %@", firstName,    
  3. lastName];    
  4. return string;    
  5. }   

對(duì)象拷貝機(jī)制

有兩種實(shí)現(xiàn)拷貝協(xié)議的copyWithZone:方法的方式:

使用alloc and init..

使用 NSCopyObject. 

看下面對(duì)象的定義

  1. @interface Product : NSObject <NSCopying> 
  2. {  
  3. NSString *productName;  
  4. float price;  
  5. id delegate;  
  6. }  
  7. @end 

拷貝后的內(nèi)存位置圖如下:

假設(shè)從supercalass繼承了NSCopying,但是父類沒有實(shí)現(xiàn)NSCopying,那么你要實(shí)現(xiàn)的話必須拷貝super的實(shí)例,同樣包括自己聲明的變量。一般情況下安全的方式是使用如alloc,
init..., and set methods

另外一方面,如果super類已經(jīng)實(shí)現(xiàn)了NSCopying,并且在你的類中你聲明了一些實(shí)例變量,那么你必須實(shí)現(xiàn)copyWithZone:

如果類沒有繼承NSCopying的行為,那么實(shí)現(xiàn)copyWithZone: using alloc,init..., and set methods.下面是一個(gè)例子

  1. - (id)copyWithZone:(NSZone *)zone  
  2. {  
  3. Product *copy = [[[self class] allocWithZone: zone]  
  4. initWithProductName:[self productName]  
  5. price:[self price]];  
  6. [copy setDelegate:[self delegate]];  
  7. return copy;  

有些繼承了NSCopying behavior的類,但是他們的super類的實(shí)現(xiàn)可能使用了 NSCopyObject function. NSCopyObject creates an exact shallow copy of an object

by copying instance variable values but not the data they point to. 舉個(gè)例子, NSCell類采用如下的方式實(shí)現(xiàn)copyWithZone

  1. - (id)copyWithZone:(NSZone *)zone  
  2. {  
  3. NSCell *cellCopy = NSCopyObject(self, 0, zone);  
  4. /* Assume that other initialization takes place here. */  
  5. cellCopy->image = nil;  
  6. [cellCopy setImage:[self image]];  
  7. return cellCopy;  

在上面的實(shí)現(xiàn)采用的是淺拷貝

對(duì)可變長度的對(duì)象的拷貝實(shí)現(xiàn) ,要繼承NSMutableCopying

Core Foundation Objects in Cocoa中的內(nèi)存管理

  1. Core Foundation's memory allocation policy is that you need to release values returned   
  2. by functions with “Copy” or “Create” in their name; you should not release values   
  3. returned by functions that do not have “Copy” or “Create” in their name. 

舉幾個(gè)例子

  1. NSString *str = [[NSString alloc] initWithCharacters: ...]; ... [str release];  
  2. is equivalent to  
  3. CFStringRef str = CFStringCreateWithCharacters(...); ...  
  4. CFRelease(str);  
  5. and  
  6. NSString *str = (NSString *)CFStringCreateWithCharacters(...); ...  
  7. [str release];  
  8. and  
  9. NSString *str = (NSString *)CFStringCreateWithCharacters(...);  
  10. ... [str autorelease];  
  11. Memory Management of Nib Objects 

The File’s Owner of a nib file缺省要去釋放NIB資源及頂層的對(duì)象

NIB文件的全局擁有者是全局應(yīng)用對(duì)象NSApp,但是當(dāng)Cocoa應(yīng)用終止時(shí),nib中的頂層對(duì)象也沒有自動(dòng)獲得dealloc消息,因?yàn)镹SApp已經(jīng)被析構(gòu)了。換句話說,即使nib主文件中,你也不得不管理頂層對(duì)象的內(nèi)存

實(shí)際上也不用擔(dān)心,mac已經(jīng)有兩個(gè)特征可以幫助你了

NSWindow對(duì)象有一個(gè)isReleasedWhenClosed屬性,設(shè)置為YES則關(guān)閉窗口對(duì)象時(shí)自動(dòng)關(guān)閉相關(guān)對(duì)象

nib文件的擁有者是一個(gè)NSWindowController對(duì)象,那么他會(huì)調(diào)用NSDocument來管理一個(gè)NSWindowController的實(shí)例,會(huì)自動(dòng)釋放他管理的窗口的

所以現(xiàn)實(shí)情況就是雖然你要負(fù)責(zé)釋放一個(gè)nib文件中的top-level對(duì)象,但是只要你的nib文件的owner是一個(gè)NSWindowController的實(shí)例,那么它會(huì)幫你釋放的。如果你的一個(gè)對(duì)象加載了nib自身并且文件的擁有者并不是NSWindowController,那么你可以為nib中的對(duì)象定義outlets,這樣你就可以在恰當(dāng)?shù)臅r(shí)候釋放他們。如果你不想為每個(gè)對(duì)象都聲明outlet,你也可以這樣:

NSNib類的instantiateNibWithOwner:topLevelObjects: 方法來獲得nib文件中的所有頂層對(duì)象

內(nèi)存管理總之可以歸結(jié)為:

(1)你通過帶alloc,new,copy的函數(shù)創(chuàng)建的對(duì)象,你擁有他

(2)通過retain你可以獲得擁有權(quán)

(3)任何一個(gè)對(duì)象都可能有很多個(gè)owner

(4)你擁有的對(duì)象你必須通過發(fā)送release或者是autorelease釋放他們

(5)你不能釋放不是你擁有的對(duì)象

(6)對(duì)set類型的賦值函數(shù),你可以retain傳入的對(duì)象,你也可以copy一份,看你自己的要求咯

(7)在函數(shù)(void)dealloc中一定要釋放你聲明的instance變量呀

(8)指針變量使用完了一定要設(shè)為nil

(9)你要確定一個(gè)對(duì)象不被釋放掉,你***提前retain一下

(10)在任何時(shí)候都不要直接調(diào)用dealloc

小結(jié):蘋果開發(fā)教程 Cocoa內(nèi)存管理筆記的內(nèi)容介紹完了,希望本文對(duì)你有所幫助!

責(zé)任編輯:zhaolei 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2011-06-17 15:57:46

CocoaXcode蘋果

2011-07-28 11:12:25

Cocoa 內(nèi)存

2011-08-15 16:28:06

Cocoa內(nèi)存管理

2011-06-17 16:23:49

Cocoa蘋果

2011-08-10 18:37:32

CocoaMac OS X

2011-07-07 09:54:01

Cocoa Core Foundation

2011-06-15 17:02:02

CocoaiOS

2011-07-26 15:29:36

Cocoa 模式

2011-05-11 17:48:31

CocoaiOS

2011-07-25 13:15:34

Cocoa MVC 架構(gòu)

2011-06-17 15:38:15

Cocoa蘋果

2011-07-26 10:42:00

Cocoa Cocoa2d 游戲

2011-06-15 16:11:51

UIKitCocoa TouchiOS

2011-08-11 15:46:55

CocoaCocoa Touch框架

2011-07-25 14:32:40

Cocoa 框架 函數(shù)

2011-07-21 14:42:45

iOS UIViewCont 內(nèi)存

2014-07-31 10:48:09

Android內(nèi)存管理OOM

2011-08-15 16:09:44

Cocoa對(duì)象Objective-C

2011-08-15 15:26:20

iPhone開發(fā)CocoaXML

2011-08-10 16:27:07

Cocoa TouchPlist
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)