Objective-C防止NSString被释放/释放

时间:2012-08-14 12:52:54

标签: iphone objective-c dealloc

总新手Iphone / Obj。 C问题:

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

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

在我的位置。我需要方法:

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

3 个答案:

答案 0 :(得分:2)

您应该为您尝试使用的iVars声明保留/强大属性。我不确定你是如何存储“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];
...}

答案 1 :(得分:2)

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

然而,除此之外,您可以修改代码,因为它目前以最小的更改编写。改变这个:

lat = lati;
lon = longi;

到此:

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

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

答案 2 :(得分: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