2011-10-17 45 views
0

我在一個將指針作爲參數傳遞的方法中找到了一個autorelease池。使用指針作爲參數並使用自動釋放池的方法

1. 2是否有任何關係?

- (void)exportXMLToString:(NSMutableString **)aString 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    NSMutableString *theString = *aString; 

2. 更普遍,爲什麼我要傳遞的字符串指針的我不能只是把這個字符串本身並返回回來?

3. 如果我想覆蓋這種方法,並從中調用超類方法,我可以只寫這個嗎? (和相同的字符串使用?

- (void)exportXMLToString:(NSMutableString **)aString 
    { 
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

     NSMutableString *theString = *aString; 

      ... 

      [super exportXMLToString:aString]; 
    } 

感謝

+0

請注意'**'是指向指針的指針。 – Macmade

回答

1

傳遞這樣的字符串,使得它讓那些對字符串進行的方法中的任何改變字符串將持續存在的方法之外,它需要XML並將其存儲在你提供的字符串中

autorelease池只是處理所有的autorelease語句發生之前,該池被耗盡如果你正在執行一堆代碼,可以產生大量的自動釋放對象,你可以將代碼包裝在自己的autorelease池中,而不是等待下一次de故障一漏。這與字符串如何傳入方法無關。

如果您打算從您重寫的方法調用超類方法,則不需要添加另一個自動釋放池,除非在超類方法之外進行一堆自己的自動釋放操作。它仍然會像以前一樣創建和處理自己的自動釋放池。

+0

謝謝!最後一個問題:在我的代碼中,我將aString分配給本地的theString對象。如果我在這一行之後調用超級方法,是否對theString和aString進行了更改?換句話說,我仍然指內存中的同一個對象是正確的嗎? – aneuryzm

+0

不一定。如果你調用NSMutableString提供的方法,它們會影響兩者,但只是賦值可能沒有你期望的影響。一個NSString已經是一個指向NSString對象的指針。傳入的值是指向NSString對象的指針。 NSString * theString只是一個指向字符串的常規指針,並將其指定爲指向指向aString指向的同一個字符串。對不起,我知道這是很多指向。讓我知道是否需要更多的澄清。 – RPeck

+0

基本上,如果您更改aString指向的內容,它也會在方法外改變。 'aString =&theString'會導致您傳遞給方法的任何字符串指向該字符串,即使您已退出該方法。 – RPeck

1

注意,這是完全錯誤的:

- (void)exportXMLToString:(NSMutableString **)aString 

從未理由有一個返回void需要**參數的方法。相反,它應該直接返回值。

通過引用在Objective-C中很少使用,通常只用於參數NSError**,儘管有其他一些參數。