2010-06-28 34 views
0
int someFunction (CLLocation *currentLocation) { 
    double latitude = 12.3f; 
    double longitude = 22.5f; 
    CLLocationDistance d1 = [currentLocation distanceFromLocation: 
    [[CLLocation alloc] initWithLatitude:latitude longitude:longitude]]; 
    return 0; 
} 

回答

1

是的。 Objective-C的內存管理,可以看起來很複雜,但記住一個基本的規則將帶你:

如果使用名稱以「黃金」或「新」的方法或創建你需要一個對象的所有權包含「複製」(例如,alloc,newObject或mutableCopy),或者如果您發送一個保留消息。您有責任放棄使用發行版或自動發行版所擁有的對象的所有權。任何其他時間你收到一個對象,你不能釋放它。

你叫alloc沒有releaseautorelease,所以你打破了規則。

+0

謝謝。 @「Fsfsdfsd」常量的處理方式不同嗎? – Jarsj 2010-06-28 23:24:13

+0

您不必擔心字符串常量。你不會「分配」它們 - 它們總是在那裏,無論它們被保留或釋放了多少次。 (但是,對於使用任何'NSString'變量來做正確的事情仍然是一個好主意,以防將來有一天你把某些東西放在那裏不是一個常量。) – 2010-06-29 00:14:59

3

是的。您正在分配第二個CLLocation以傳遞給distanceFromLocation而不是釋放它。

你可以做,而不是:

CLLocationDistance d1 = [currentLocation distanceFromLocation: 
    [[[CLLocation alloc] initWithLatitude:latitude longitude:longitude] autorelease]]; 

(或各種其他的事情見docs,如@whisty的意見建議。)

(此外,它似乎有點毫無意義,使呼叫並將其值分配給d1,然後將其丟棄。)

+0

你也許應該閱讀關於內存管理的蘋果文檔 - http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html#//apple_ref/doc/uid/ 20000994-BAJHFBGH – 2010-06-28 22:54:19

2

是的。你分配一個CLLocation對象,但從不釋放它。我強烈建議您通讀​​。