Iphone 目标-C防止NSString被释放/解除锁定

Iphone 目标-C防止NSString被释放/解除锁定,iphone,objective-c,dealloc,Iphone,Objective C,Dealloc,总新手Iphone/Obj。C问题: 我有一个名为Location的类,在Location.h中,我声明: @interface Location : NSObject { NSString *lat; NSString *lon; } 在我的位置。m我必须: -(void)setLatLon:(NSString*)lati:(NSString*)longi { NSLog(@"called setLatLon"); lat = lati;

总新手Iphone/Obj。C问题:

我有一个名为Location的类,在Location.h中,我声明:

@interface Location : NSObject
{
     NSString *lat;
     NSString *lon;    
}
在我的位置。m我必须:

-(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似乎被解除分配了。我怎样才能防止这种情况发生,或者我在这里实现了一个完全愚蠢的“设计”?

您应该为您试图使用的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; 
}

试试这个:

@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的ARC和其他省时、避免错误的功能

然而,除此之外,您还可以修复当前编写的代码,只需稍加修改。更改此项:

lat = lati;
lon = longi;
为此:

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

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

变量imei是什么?我在您的代码中的任何其他地方都看不到它。对字符串对象使用
retain
。您读过关于Objective-C存储管理的任何内容吗?(而且,如果你是一个初学者,为什么你要从非ARC开始,而ARC将在下一年成为所有?)这不是你在Objective-C中命名方法的方式……但是,当然。如果你有这样的问题,你应该学习iOS内存管理的东西,以充分了解这里发生了什么…谢谢!我将阅读所有这些东西,但现在我只需要一个快速修复,让我继续;)成功了,非常感谢。没有自我,它就不起作用。引用,来自Java,我认为它是类似“this”的东西,这是完全错误的吗?
 lat = [lati retain]; 
 lon = [longi retain];