-1

初心者のiPhone/Objの合計。Cの質問:

Location.hi宣言にLocationというクラスがあります。

@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

したがって、lat&lonは割り当てが解除されているようです。どうすればそれを防ぐことができますか、またはここで完全に愚かな「設計」を実装しましたか?

4

3 に答える 3

2

使用しようとしているiVarのretain/strongプロパティを宣言する必要があります。「imei」をどのように保存しているかはわかりませんが、保持していないため、latとlonの割り当てが解除されています。次のようなものを試してください:

@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];
...}
于 2012-08-14T12:58:28.230 に答える
2

他の回答が示唆しているようにプロパティを追加することができます。より高度なプロジェクトに取り組み始めると、特にARCやその他のObjective-の時間節約およびエラー回避機能を利用したい場合は、そのアプローチに間違いなく同意します。 C。

ただし、それとは別に、現在最小限の変更で記述されているため、コードを修正できます。これを変える:

lat = lati;
lon = longi;

これに:

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

これにより、コードはこれらの変数への参照を保持します。このアプローチを行う場合は、通常はdeallocメソッドで、完了時に必ず変数を解放する必要があります。これに注意しないと、メモリリークが発生します。

于 2012-08-14T13:07:13.143 に答える
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を深く掘り下げたい場合は、次の記事を読む必要があります: 高度なメモリ管理プログラミングガイドObjective-Cプログラミング言語

于 2012-08-14T12:59:30.150 に答える