iphone - @property 中的内存损坏

标签 iphone objective-c ios ipad

我有下一段代码,一个具有此属性的 iVar 保留并在它的类 dealloc 方法中释放。 iVar 用于 2 种方法并不断更改值,但 有时,当我使用该值时,该值已损坏。这是为什么?

.h

@interface ChatController : NSObject <ASIHTTPRequestDelegate>{
NSTimer *timer;
NSString *_idLastMessageFromServer;
}

@property(nonatomic, retain)NSString *idLastMessageFromServer;
@end

.m

@implementation ChatController

@synthesize idLastMessageFromServer = _idLastMessageFromServer;

- (void)initLoopTimer{
timer = [NSTimer timerWithTimeInterval:5 target:self selector:@selector(update:) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
}

- (void)update:(id)sender{
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:CONSTANT_YYYY];
[request setDelegate:self];
[request addPostValue:_idLastMessageFromServer forKey:CONSTANT_XXX];
[request setDidFinishSelector:@selector(requestUpdateFinish:)];
[request startAsynchronous];
}

- (void)requestUpdateFinish:(ASIHTTPRequest *)request{
NSString *response = [request responseString];
if(response && response.length){
    if(![response isEqualToString:CHAT_RESPONSE_NO_MESSAGES]){
        NSArray *array = [response componentsSeparatedByString:CHAT_PARSE_RESPONSE];
        if(array && [array count] == 2){
            **_idLastMessageFromServer = [array objectAtIndex:0];**
        }
     }
   }
}

但是当循环调用方法update:时,就在这行代码中崩溃了

[request addPostValue:_idLastMessageFromServer forKey:CONSTANT_XXX];

带有 EXC_BAD_ACCESS 消息,但为什么呢?

最佳答案

这一行:

_idLastMessageFromServer = [array objectAtIndex:0];

应该是

self.idLastMessageFromServer = [array objectAtIndex:0];

这将直接访问属性而不是变量,从而在赋值期间触发保留/释放。否则,指针被赋值,但从数组中取出的对象并没有被保留,它可能很快就会失效,剩下一个指向已释放对象的指针。

关于iphone - @property 中的内存损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10483808/

相关文章:

iphone - 如何优化基于Titanium的iPhone应用程序的大小?

ios - 重播套件 IOS 无法工作?

ios - 我可以在应用程序启动后收到 iOS Startup Notification 吗?

Iphone:获取当前 View 尺寸或屏幕尺寸

iphone - 使用 Quartz 时如何去掉 UIView 的锯齿?

ios - 今日小部件未在设备上显示

iphone - UITableViewController 中的复制/粘贴功能

iphone - 如何在 for 循环中使用动画设置按钮 alpha?

iOS 的 SKPayment addTransactionObserver & defaultqueue,是怎么回事?

ios - UIAccessibilityNotificationQuestion