成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

蘋果開發教程 Cocoa內存管理筆記

移動開發 iOS
本文介紹的是蘋果開發教程 Cocoa內存管理筆記,很詳細的介紹了對內存的管理,如何管理,我們來看內容。

蘋果開發教程 Cocoa內存管理筆記是本文要介紹的內容,內容分為兩種方式進行介紹,我們來看詳細內容。

下面的這種方式是不對的

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

創建的是一個autorelease的對象[self setCount:zero];[zero release];//這里釋放是危險的}

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

it.在集合中增加object,那么這個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的計數減1而已 

安全返回對象

下面兩種方式是正確的

  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.  }  

相反,下面的方式是錯誤的

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

8 同樣,下面的方式也是錯的

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

對象拷貝機制

有兩種實現拷貝協議的copyWithZone:方法的方式:

使用alloc and init..

使用 NSCopyObject. 

看下面對象的定義

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

拷貝后的內存位置圖如下:

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

另外一方面,如果super類已經實現了NSCopying,并且在你的類中你聲明了一些實例變量,那么你必須實現copyWithZone:

如果類沒有繼承NSCopying的行為,那么實現copyWithZone: using alloc,init..., and set methods.下面是一個例子

  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類的實現可能使用了 NSCopyObject function. NSCopyObject creates an exact shallow copy of an object

by copying instance variable values but not the data they point to. 舉個例子, NSCell類采用如下的方式實現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;  

在上面的實現采用的是淺拷貝

對可變長度的對象的拷貝實現 ,要繼承NSMutableCopying

Core Foundation Objects in Cocoa中的內存管理

  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. 

舉幾個例子

  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資源及頂層的對象

NIB文件的全局擁有者是全局應用對象NSApp,但是當Cocoa應用終止時,nib中的頂層對象也沒有自動獲得dealloc消息,因為NSApp已經被析構了。換句話說,即使nib主文件中,你也不得不管理頂層對象的內存

實際上也不用擔心,mac已經有兩個特征可以幫助你了

NSWindow對象有一個isReleasedWhenClosed屬性,設置為YES則關閉窗口對象時自動關閉相關對象

nib文件的擁有者是一個NSWindowController對象,那么他會調用NSDocument來管理一個NSWindowController的實例,會自動釋放他管理的窗口的

所以現實情況就是雖然你要負責釋放一個nib文件中的top-level對象,但是只要你的nib文件的owner是一個NSWindowController的實例,那么它會幫你釋放的。如果你的一個對象加載了nib自身并且文件的擁有者并不是NSWindowController,那么你可以為nib中的對象定義outlets,這樣你就可以在恰當的時候釋放他們。如果你不想為每個對象都聲明outlet,你也可以這樣:

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

內存管理總之可以歸結為:

(1)你通過帶alloc,new,copy的函數創建的對象,你擁有他

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

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

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

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

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

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

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

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

(10)在任何時候都不要直接調用dealloc

小結:蘋果開發教程 Cocoa內存管理筆記的內容介紹完了,希望本文對你有所幫助!

責任編輯:zhaolei 來源: 互聯網
相關推薦

2011-06-17 15:57:46

CocoaXcode蘋果

2011-07-28 11:12:25

Cocoa 內存

2011-08-15 16:28:06

Cocoa內存管理

2011-08-10 18:37:32

CocoaMac OS X

2011-07-07 09:54:01

Cocoa Core Foundation

2011-06-17 16:23:49

Cocoa蘋果

2011-06-15 17:02:02

CocoaiOS

2011-07-25 13:15:34

Cocoa MVC 架構

2011-07-26 15:29:36

Cocoa 模式

2011-05-11 17:48:31

CocoaiOS

2011-07-26 10:42:00

Cocoa Cocoa2d 游戲

2011-06-17 15:38:15

Cocoa蘋果

2011-06-15 16:11:51

UIKitCocoa TouchiOS

2011-08-11 15:46:55

CocoaCocoa Touch框架

2011-07-25 14:32:40

Cocoa 框架 函數

2011-07-21 14:42:45

iOS UIViewCont 內存

2014-07-31 10:48:09

Android內存管理OOM

2011-08-15 16:09:44

Cocoa對象Objective-C

2011-07-07 14:46:10

Cocoa Xcode

2011-08-10 16:27:07

Cocoa TouchPlist
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美精品一区二区蜜桃 | 国产一区二区三区在线免费 | 国产精品久久久久久久白浊 | 91麻豆久久久 | 91久久国产综合久久91精品网站 | 日本免费一区二区三区四区 | 伊人久久一区二区 | 欧美综合一区二区 | 日韩精品一区二区在线 | 欧美日韩免费 | 久久一 | 国产欧美日韩精品一区 | 亚洲免费久久久 | 国产女人与拘做受免费视频 | 久久精品无码一区二区三区 | 91高清视频在线观看 | 亚洲高清视频在线观看 | 久久午夜精品 | 精品国产乱码久久久久久图片 | 91资源在线 | 久久九九影视 | 国内精品久久久久 | 欧区一欧区二欧区三免费 | 久久成人精品视频 | 久久国产免费看 | 亚洲精品久久久一区二区三区 | 亚洲啪啪 | 99热精品在线观看 | 久久草在线视频 | 午夜精品福利视频 | 亚洲风情在线观看 | www.av在线 | 午夜久久久| 日韩欧美精品一区 | 午夜天堂精品久久久久 | 欧美视频网 | 亚洲精品久久久久久久不卡四虎 | 亚洲欧美中文日韩在线v日本 | 国产精品久久久久久久久图文区 | 精品国产乱码久久久久久88av | 国产毛片久久久久久久久春天 |