2010-06-28 50 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对象,但从不释放它。我强烈建议您通读​​。