2010-02-19 49 views
1

我無法繞過這個由於某種原因...客觀的c重新分配點

我有一個類(模型)與伊娃(價值)。我想將這個值傳遞給一個方法,並將值ivar改爲指向別的東西。這將aValue更改爲指向newString。那麼,我如何才能讓model.value指向newString,並說出model.value = newString

(void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
Model * model = [[Model alloc] init];//model.value gets set in init 
[self doSomething:model.value]; 
NSLog(@"changed? %@", model.value); 
} 

- (void)doSomething:(NSString *)aValue 
{ 
NSString * newString = [[NSString alloc] initWithString:@"new string"]; 
aValue = newString; 
NSLog(@"changed? %@", aValue); 
} 

另外,我怎麼得到這個代碼塊正常工作?

回答

0

您需要傳遞一個指向伊娃的指針,而不是伊娃本身。

[self doSomething:&model.value]; 

,創造你的方法,像這樣:

- (void)doSomething:(NSString**)aValue { 
    *aValue = @"new string"; 
} 

所以,當你做

NSString *foo = @"old string"; 
[self doSomething:&foo]; 
NSLog(@"foo is: %@", foo); 

foo的價值@"new string"

您正在接受指向該對象的指針,並將其指向另一個對象。通常,該函數獲取自己的指針,併爲其分配一個新值,但在創建它的範圍之外沒有任何效果。

我實際上不確定這是什麼正式調用,但我非常確定這是如何工作的。更熟悉C的人可能會澄清。

而且,當然,這個例子很容易通過簡單地返回一個值來清除。這個技巧很有用,但我認爲在大多數情況下,如果您避免使用此模式,您的代碼將更易於理解並且整體更清晰。所以只有在有充分理由的情況下才能使用它,比如你有一個返回值的方法,但也希望返回更多的值,這些值可能或可能不重要,調用者可以選擇捕獲。但是如果你可以簡單地返回一個值並賦值,那麼你可能會更好。

+0

我更新的方法來使用(的NSString **)和 我試過[自DoSomething的:model.value]。但xcode給我 嘗試'[self doSomething:&[model value]]'作爲一元'&'操作數 – joels 2010-02-19 01:49:38

+0

需要左值。它可能不喜歡屬性的語法。 – 2010-02-19 06:38:10

1

更新財產使用model.value=newString有什麼問題?如果你真的想doSomething:修改其字符串參數,你需要一個指針傳遞給變量:

- (void)doSomething:(NSString **)aValue 
{ 
    [*aValue release]; 

    NSString * newString = [[NSString alloc] initWithString:@"new string"]; 
    *aValue = newString; 
    NSLog(@"changed? %@", *aValue); 
} 

,並調用它像這樣:

[self doSomething:&value]; 

但這還不是很習慣。這可能是清潔劑只返回一個值,讓調用者決定如何管理結果:

- (NSString*)doSomething 
{ 
    NSString * newString = [[NSString alloc] initWithString:@"new string"]; 
    NSLog(@"changed? %@", *aValue); 
    return [newString autorelease]; 
}