总新手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似乎被解除了分配。我怎么能阻止这种情况,或者我在这里实现了一个完全愚蠢的“设计”?
答案 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 Guide和The Objective-C Programming Language