-1

总新手 Iphone/Obj。C题:

我有一个名为 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

所以 lat & lon 似乎被释放了。我怎样才能防止这种情况发生,或者我在这里实施了一个完全愚蠢的“设计”?

4

3 回答 3

2

您可以像其他回复所建议的那样添加属性,并且当您开始着手进行更高级的项目时,我绝对同意这种方法,特别是如果您想利用 ARC 和其他节省时间和避免错误的目标功能- C。

但是,除此之外,您可以修复当前编写的代码,只需进行最小的更改。改变这个:

lat = lati;
lon = longi;

对此:

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

这将导致您的代码保留对这些变量的引用。如果您采用这种方法,您将需要确保在完成后释放您的变量,通常是在一个 dealloc 方法中。如果您不注意这一点,您将造成内存泄漏。

于 2012-08-14T13:07:13.143 回答
2

您应该为您尝试使用的 iVar 声明保留/强属性。我不确定你是如何存储“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 回答
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 开发,您应该阅读以下文章: 高级内存管理编程指南Objective-C 编程语言

于 2012-08-14T12:59:30.150 回答