2010-09-17 97 views
0

大家好,我還是iPhone的新手,但對其他編程語言有着豐富的經驗。 Obj-C存儲管理和釋放/保持正確的東西,讓我拉我的頭髮。我知道這個概念,我知道「有一次我明白這很容易」,但我還沒有完全沉浸在這裏,這讓我發瘋。在這裏,我有一個類和方法的簡單代碼片段,只是將一個字符添加到現有的字符串,這是合成的,因此用作類專有...該類例如稱爲myClass ...正確地釋放並保留NSString *

myClas.h

@interface myClass : NSObject { 
    @private 
    NSString* someCommonString; 
} 
@propery (retain, nonatomic) NSString* someCommonString; 

myClass.m

... 

@synthesize someCommonString;  

- (id) init 
{ 
    self = [super init]; 

    if(self) 
    { 
     someCommonString = [[NSString alloc] initWith String:@"one "]; 
    } 
} 

- (NSString*) appendString:(NSString*) stringToAdd 
{ 
    NSString* result = [someCommonString stringByAppendingString: stringToAdd]; 
    return result; 
} 

- (void) doTheJob 
{ 
    NSString* test1 = @"two "; 
    NSString* test2 = [[NSString alloc] initWithString: @"three "]; 
    NSString* test3 = [NSString stringWithFormat:@"four "]; 

    self.someCommonString = [self appendString:test1]; 
    self.someCommonString = [self appendString:test2]; 
    self.someCommonString = [self appendString:test3]; 

    NSLog(@"%@", someCommonString); 
} 

- (void) dealloc 
{ 
    [someCommonString release]; 
    [super release]; 
} 
... 

好吧,以後我ALLOC myClass的,執行doTheJob方法,我應該在someCommonString類proprety有@ 「一二三四」。我知道這是工作,但也是地獄般泄漏。 test1,test2和test3是初始化NSString的三種方法,只有test2應該被釋放,這是非常明顯的,但是我更擔心將它們作爲參數傳遞給appendString方法時會發生什麼。因爲在那裏我知道我有一個泄漏,但不知道如何處理1. stringToAdd參數[我應該擔心它在appendString方法嗎?] 2.結果 - >如果我autorelease結果,我不知道結果將在何處被釋放。 3. appendStringMethod中的sommeCommonString,我是否應該保留它,釋放它還是讓它獨立?

哈:)

回答

1

乍一看,這似乎對我來說,你不釋放test2。將它附加到常用字符串後,您不必再保留它。

self.someCommonString = [self appendString:test1]; 
self.someCommonString = [self appendString:test2]; 
self.someCommonString = [self appendString:test3]; 
[test2 release]; 

另外兩個(test1test3)被自動釋放,那麼你的線程會在某一時刻收回它們)。

至於您appendString:方法而言,result已經自動釋放,實際上你可以實現你減少

return [someCommonString stringByAppendingString: stringToAdd]; 

someCommonString不影響操作的。 stringByAppendingString:返回一個新的自動發佈的字符串從串聯的selfstringToAdd

希望幫助

+0

非常感謝!儘管stringByAppendingString不是自動發佈的 – cybercow 2010-09-17 12:16:33

0

...但即時通訊更擔心將它們作爲參數傳遞給appendString方法時會發生什麼。因爲我知道我HAWE泄漏,但不知道如何處理
1. stringToAdd參數[我應該擔心它在appendString方法呢?] ...

您沒有泄漏在-appendString:。你通過stringToAdd而沒有保留它,這沒關係。 result是autoreleased,你不必採取任何行動。

2。 結果 - >如果我autorelease結果,我不知道在哪一點結果將被釋放。

結果已經自動發佈,將在當前發佈NSAutoreleasePool後立即發佈。直到那麼你可以通過它,沒有保留。

3.   sommeCommonString在appendStringMethod中,我應該保留它,釋放它還是讓它獨立?

不要管它,它由訪問者管理。但正如fedmest(也是你)所說:release test2

0

那麼在你的代碼中有幾個問題,但基本問題是你需要NSMutableString字符串,而不是NSString來使你的代碼工作。

  1. 在init方法中,正確的代碼初始化是,

    someCommonString = [[NSMutableString alloc] initWithString:@"one "];

  2. 你必須返回由init對象(個體經營),否則將無法正常工作,像這樣。

    return self;

  3. 如果你想添加的字符串,它應該是的NSMutableString,不是的NSString。

    [[self someCommonString] appendString:test1];

    [[self someCommonString] appendString:test2];

    [[self someCommonString] appendString:test3];

  4. 在dealloc方法,您撥打的dealloc超的方法,不釋放超。所以糾正它是這樣的。

    [super dealloc];

  5. 沒有必要釋放test1test3,因爲他們是自動釋放

我已經見證了正確的代碼,試試看。

@interface myClass : NSObject { 
@private 
    NSMutableString* someCommonString; 
} 
@property (retain, nonatomic) NSMutableString* someCommonString; 

- (void) doTheJob; 
@end 


@implementation myClass 
@synthesize someCommonString; 


- (id) init 
{ 
    self = [super init]; 

    if(self) 
    { 
     someCommonString = [[NSMutableString alloc] initWithString:@"one "]; 
    } 

    return self; 
} 

- (NSString*) appendString:(NSString*) stringToAdd 
{ 
    NSString* result = [someCommonString stringByAppendingString: stringToAdd]; 
    return result; 
} 

- (void) doTheJob 
{ 
    NSString* test1 = @"two "; 
    NSString* test2 = [[NSString alloc] initWithString: @"three "]; 
    NSString* test3 = [NSString stringWithFormat:@"four "]; 

    [[self someCommonString] appendString:test1]; 
    [[self someCommonString] appendString:test2]; 
    [[self someCommonString] appendString:test3]; 



    NSLog(@"%@", someCommonString); 

    [test2 release]; 
} 

- (void) dealloc 
{ 
    [someCommonString release]; 
    [super dealloc]; 
} 
@end 
+0

非常感謝您的努力。對不起我打了幾個拼寫錯誤,並忘記重新輸入返回...有點擔心你的重做,用[[some someCommonString] appendString ...你正在調用someCommonString方法appendAstring生成被識別的選擇器。 4我這隻會用於與NSString/NSMutableString類別使用?我對regullar NSString使用stringByAppendingString沒有麻煩,但不知道這是否正確? – cybercow 2010-09-17 12:13:52

+0

stringByAppendingString只會將字符串連接到字符串對象並返回附加字符串,但不會更改原始字符串內容。 – itsaboutcode 2010-09-17 12:25:28

0

這是一種技巧,可以幫助您更好地處理@synthesize指令發生的情況。更改標題如下

@interface myClass : NSObject { 
    @private 
    NSString* _bob; 
} 
@property (retain, nonatomic) NSString* someCommonString; 

和你的類文件

@synthesize someCommonString = _bob; 

如果重新編譯代碼,你會得到編譯錯誤。修復這些問題,您將突然能夠看到您通過綜合屬性訪問的內容以及您直接訪問的內容。

此外,如前所述,您需要在doTheJob方法中釋放test2。

+0

你也捉住了我的懷疑,隱藏在行之間!肯定會嘗試這個!非常感謝你! – cybercow 2010-09-17 12:28:30