【问题标题】:Objective- C prevent NSString from being released/ deallocObjective-C 防止 NSString 被释放/释放
【发布时间】:2012-08-14 12:52:54
【问题描述】:

总新手 Iphone/Obj。 C题:

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

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

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

【问题讨论】:

  • imei这个变量是什么?我在您的代码中的其他任何地方都没有看到它。
  • 对你的字符串对象使用retain..
  • 你读过任何关于 Objective-C 存储管理的文章吗? (而且,如果您是初学者,为什么要从非 ARC 开始,而 ARC 将在另一年成为全部?)
  • 这不是你在 Objective-C 中命名方法的方式...

标签: iphone objective-c dealloc


【解决方案1】:

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

【讨论】:

  • 但是,当然。如果您遇到此类问题,您应该研究 iOS 内存管理的东西以充分了解这里发生的事情......
  • 谢谢!我会阅读所有这些东西,但现在我只需要一个快速修复来让我继续前进;)
【解决方案2】:

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

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

lat = lati;
lon = longi;

到这里:

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

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

【讨论】:

    【解决方案3】:

    试试这个:

    @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 开发,你应该阅读以下文章: Advanced Memory Management Programming GuideThe Objective-C Programming Language

    【讨论】:

    • 做到了,非常感谢。没有自我它是行不通的。参考,来自Java,我认为它是“this”之类的东西,完全错误吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多