如何解决线程1:程序接收到的信号:“ EXC_BAD_ACCESS”
|| 我只有一个简单的代码来练习对象C。 我不确定为什么可以使用此“警告”吗? 我的代码如下#import <Foundation/Foundation.h>
@interface MyClass : NSObject {
@private
NSDate *mdate;
}
@property (retain) NSDate *mdate;
@end
=================================
#import \"MyClass.h\"
@implementation MyClass
@synthesize mdate;
- (id)init
{
self = [super init];
if (self) {
// Initialization code here.
mdate = [[NSDate date] autorelease];
}
return self;
}
- (void)dealloc
{
[super dealloc];
}
@end
============================================
#import <Foundation/Foundation.h>
#import \"MyClass.h\"
int main (int argc,const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
MyClass *mclass = [[MyClass alloc]init];
NSDate *myBirthday;
NSDateFormatter *dateFormat = [[NSDateFormatter alloc]init];
[dateFormat setDateFormat:@\"yyyy/MM/dd\"];
myBirthday=[dateFormat dateFromString:@\"1990/09/02\"];
[mclass setMdate:myBirthday];
NSLog(@\"My Birthday is %@\",[mclass mdate]);
// insert code here...
NSLog(@\"Hello,World!\");
[mclass release];
//[dateFormat release];
[pool drain];
return 0;
}
然后在[池排水]->我跑完后收到消息。
我真的是Object C的新手。有人可以解释一下我错过的内容吗?
我认为这导致我的内存管理(?)
顺便说一句,我是为控制台编写的。
解决方法
Mdate已发布。
通常,您的内存管理是完全错误的。阅读“可可内存管理指南”,因为它清楚地解释了相对简单的规则。
, 您不应释放您未分配或初始化的对象。
mdate = [[NSDate date] autorelease]; //Wrong statement.
在MyClass
的init函数中,不应在未创建的NSDate
对象上调用autorelease
,而是从iOS框架获取它,并且iOS负有释放它的责任。
这是您的“ 7”对象被过度释放的情况。
mdate = [NSDate date]; //Correct statement.
阅读《 Apple内存管理编程指南》
, 如果您的.h文件是这样定义的:
#import <Foundation/Foundation.h>
@interface MyClass : NSObject {
@private
NSDate *mdate;
}
@property (retain) NSDate *mdate;
@end
然后,您的.m文件应如下所示:
#import \"MyClass.h\"
@implementation MyClass
@synthesize mdate;
- (id)init
{
self = [super init];
if (self) {
// mdate = [[NSDate date] autorelease]; WRONG
// mdate = [NSDate date]; WRONG
mdate = [[NSDate date] retain]; CORRECT
// mdate = [[NSDate alloc] init]; CORRECT
// mdate = [[[[NSDate alloc] init] autorelease] retain]; CORRECT (but weird)
// self.mdate = [NSDate date]; CORRECT
}
return self;
}
- (void)dealloc
{
[mdate release]; // NECESSARY
[super dealloc];
}
@end
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。