Iphone 线程1:程序接收信号:“1”;EXC“不良访问”;
我只有一个简单的代码来练习对象C。。 我不知道为什么我能听到这个“警告”? 我的代码在下面Iphone 线程1:程序接收信号:“1”;EXC“不良访问”;,iphone,objective-c,c,object,Iphone,Objective C,C,Object,我只有一个简单的代码来练习对象C。。 我不知道为什么我能听到这个“警告”? 我的代码在下面 #import <Foundation/Foundation.h> @interface MyClass : NSObject { @private NSDate *mdate; } @property (retain) NSDate *mdate; @end ============================================= #import "MyC
#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;
}
#导入
#导入“MyClass.h”
int main(int argc,const char*argv[]
{
NSAutoreleasePool*池=[[NSAutoreleasePool alloc]init];
MyClass*mclass=[[MyClass alloc]init];
NSDate*我的生日;
NSDateFormatter*dateFormat=[[NSDateFormatter alloc]init];
[日期格式setDateFormat:@“yyyy/MM/dd”];
我的生日=[dateFormat dateFromString:@“1990/09/02”];
[McClass setMdate:我的生日];
NSLog(@“我的生日是%@”,[McClass mdate]);
//在这里插入代码。。。
NSLog(@“你好,世界!”);
[McClass释放];
//[日期格式发布];
[泳池排水沟];
返回0;
}
在[pool drain]>中,我在跑步后收到了消息
我真的是C对象的新手。有人能解释一下我错过了什么吗?
我想这会导致我的内存管理(?)
顺便说一句,我是为console写这篇文章的。Mdate发布过度了
一般来说,内存管理是非常错误的。阅读“Cocoa内存管理指南”,因为它清楚地解释了相对简单的规则。您不应该释放既不是您分配的也不是您初始化的对象
mdate = [[NSDate date] autorelease]; //Wrong statement.
在MyClass
的init函数中,您不应该调用NSDate
对象上的autorelease
,该对象不是您创建的,您从iOS框架中获得,iOS有责任释放它
以下是您的mdate
对象过度扩展的情况
mdate = [NSDate date]; //Correct statement.
如果.h文件的定义如下,请阅读Apple:
#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) {
// 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
您不释放池对象,这是一个内存泄漏,尽管应用程序在它之后直接终止,但最好释放它,而不是耗尽它。释放它将为您排出它。实际上,
drain
会排出池中的水并释放它。至少这行代码是正确的。