2011-03-26 44 views
1

我正在嘗試爲使用MapKit的iphone開發我的第一個簡單應用程序。我現在可以通過這個簡單的代碼在地圖上顯示多個註釋。 MyAnnotation是生成註釋的類,initWithInfo是設置座標和標題的方法。iPhone MapKit多註釋問題。這是繼續進行的正確方法嗎?

//the first annotation 
theCoordinate.latitude = 0.000; 
theCoordinate.longitude = 0.000; 
MyAnnotation *myAnnotation1 = [MyAnnotation alloc]; 
[myAnnotation1 initWithInfo:theCoordinate:@"Title":@"Subtitle"]; 
[self.mapAnnotations insertObject:myAnnotation1 atIndex:0]; 
[myAnnotation1 release]; 

//the second annotation 
theCoordinate.latitude = 0.000; 
theCoordinate.longitude = 0.000; 
MyAnnotation *myAnnotation2 = [MyAnnotation alloc]; 
[myAnnotation2 initWithInfo:theCoordinate:@"Title":@"Subtitle"]; 
[self.mapAnnotations insertObject:myAnnotation2 atIndex:0]; 
[myAnnotation2 release]; 

上面的代碼需要爲每個註釋不同MyAnnotation對象,但我需要生成他們一個週期內,從而通過這種方式也不是那麼好。

爲了生成儘可能多的註釋,我想要沒有創建一個唯一的名稱對象的限制我試了下面的代碼,它工作正常。

CLLocationCoordinate2D theCoordinate; 

//the first annotation 
theCoordinate.latitude = 0.000; 
theCoordinate.longitude = 0.000; 
[self.mapAnnotations insertObject:[[MyAnnotation alloc] initWithInfo:theCoordinate:@"Title":@"Subtitle"] atIndex:0]; 

//the second annotation 
theCoordinate.latitude = 0.000; 
theCoordinate.longitude = 0.000; 
[self.mapAnnotations insertObject:[[MyAnnotation alloc] initWithInfo:theCoordinate:@"Title":@"Subtitle"] atIndex:1]; 

現在簡單的問題是:是繼續以正確的方式?這段代碼是否會導致任何問題?

預先感謝一位新手objective-c(想成爲)程序員。

回答

1

是的,主要問題是第二個代碼片段將內存泄漏添加到您的應用程序。另一個是它不會編譯。

當一個對象添加到集合其保留計數增加,這意味着,訂單

[self.mapAnnotations insertObject:[[MyAnnotation alloc] initWithInfo:theCoordinate:@"Title":@"Subtitle"] atIndex:0]; 

應該寫成

[self.mapAnnotations insertObject:[[[MyAnnotation alloc] initWithInfo:@"Title" theCoordinate:theCoordinate] autorelease] atIndex:0]; 

注意兩件事情:

  1. MyAnnotation實例在發送到註釋集合之前會發送一個「autorelease」消息。這是消除內存泄漏的一種方法。另一種方法是使用一個指針,就像之前的代碼片段一樣,然後像以前一樣發送釋放消息。
  2. 在Objective-C中,在方法調用結束時參數不會全部放在一起。

希望這會有所幫助!

+0

Thx非常的爲解釋:) – Daniele 2011-04-01 12:39:30