我只有一个简单的代码来练习对象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;
}
和[池排水] - &gt;我跑完后收到了消息。
我是对象C的新手。有人可以解释一下我错过了什么吗? 我认为这会导致我的记忆管理(?) 顺便说一句,我是在为控制台写这个。
答案 0 :(得分:5)
Mdate过度释放。
一般来说,你的内存管理是非常错误的。阅读“可可内存管理指南”,因为它清楚地解释了相对简单的规则。
答案 1 :(得分:2)
你不应该释放既不是由你分配的也不是你初始化的对象。
mdate = [[NSDate date] autorelease]; //Wrong statement.
在MyClass
的初始化功能中,您不应在autorelease
对象上调用NSDate
,不要创建,< / strong>你从iOS框架获得它,iOS有责任发布它。
以下是mdate
对象过度发布的情况。
mdate = [NSDate date]; //Correct statement.
答案 2 :(得分:0)
如果您的.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