2012-08-14 84 views
-1

總新手Iphone/Obj。 ç問題:Objective-C阻止NSString被釋放/ dealloc

我有一個名爲Location類,在Location.hi聲明:

@interface Location : NSObject 
{ 
    NSString *lat; 
    NSString *lon;  
} 

在我Location.mi不得不方法:

-(void)setLatLon:(NSString*)lati:(NSString*)longi 
{ 
    NSLog(@"called setLatLon"); 
    lat = lati; 
    lon = longi; 
} 

我在位置更新調用從LocationManager中。現在,當我嘗試發送作爲一個JSON與

-(void)sendLocation 
{ 
    NSDictionary *sendData = [NSDictionary dictionaryWithObjectsAndKeys: 
          imei, @"imei", 
          lat, @"lat", 
          lon, @"lon", 
          nil]; 
...} 

我得到這個錯誤:

*** -[CFString retain]: message sent to deallocated instance 0xc05b5d0 

所以緯度& LON似乎被釋放。我怎麼能夠阻止這個或者我在這裏實施了一個完全愚蠢的'設計'?

+0

什麼是變量imei?我在你的代碼中沒有看到它。 – user1567896 2012-08-14 12:56:33

+0

在您的字符串對象中使用'retain' .. – Ankur 2012-08-14 12:57:56

+0

您是否閱讀過有關Objective-C存儲管理的任何內容? (並且,如果你是初學者,爲什麼你在非ARC時開始,當ARC將在另一年時間全部出現?) – 2012-08-14 13:02:22

回答

1

試試這個:

@interface Location : NSObject { 

NSString *lat; 
NSString *lon; 

} 

@property (nonatomic, strong) NSString *lon; 
@property (nonatomic, strong) NSString *lat; 

@implementation Location 

@synthesize lon; 
@synthesize lat; 


-(void)setLatLon:(NSString*)lati:(NSString*)longi 
{ 
    self.lat = lati; 
    self.lon = longi; 
} 

,如果你想在深潛水ios dev,你應該閱讀以下文章: Advanced Memory Management Programming GuideThe Objective-C Programming Language

+0

這樣做,非常感謝。沒有自我就沒有工作。參考,來自Java我認爲它是像「這個」,是完全錯誤的? – FWeigl 2012-08-14 13:03:45

+0

閱讀關於objc的後續文章。 – tikhop 2012-08-14 13:05:46

2

您應該爲您嘗試使用的iVar聲明retain/strong屬性。我不確定你是如何存儲「imei」的,但經緯度和經度正在被解除分配,因爲你不保留。嘗試是這樣的:

@interface Location : NSObject 
{ 
    NSString *lat; 
    NSString *lon; 
} 

@property (retain) NSString *lat; 
@property (retain) NSString *lon; 

和.m文件:

@synthesize lat, lon; 

-(void)setLatLon:(NSString*)lati:(NSString*)longi 
{ 
    NSLog(@"called setLatLon"); 
    self.lat = lati; 
    self.lon = longi; 
} 

-(void)sendLocation 
{ 
    NSDictionary *sendData = [NSDictionary dictionaryWithObjectsAndKeys: 
          imei, @"imei", //dunno what is this 
          self.lat, @"lat", 
          self.lon, @"lon", 
          nil]; 
...} 
+0

但是,課程。如果你遇到這種問題,你應該研究iOS內存管理的東西,以充分理解這裏發生的事情...... – 2012-08-14 12:59:22

+0

謝謝你!我會閱讀所有的東西,但現在我只需要一個快速修復,讓我去;) – FWeigl 2012-08-14 13:05:02

2

其他答覆建議您可以添加的屬性,當你開始向前移動,以更先進的項目,我肯定這種做法同意工作,特別是如果你想利用ARC和其它的優勢節省時間和Objective-C的避免錯誤功能。

除此之外,你可以修改你的代碼,因爲它是用最小的改變寫的。更改此:

lat = lati; 
lon = longi; 

這樣:

lat = [lati retain]; 
lon = [longi retain]; 

這將導致你的代碼保留有這些變量的引用。如果你採用這種方法,你會希望確保在你完成時釋放變量,通常在dealloc方法中。如果你不注意這一點,你將會造成內存泄漏。

相關問題