我有一个类“TestA”并将其对象放在main函数的NSMutable字典中。第二个类名为“ThreadClass”,有一个帖子。在这个线程中,我从字典中获取对象并使用它。当我运行此程序时,仪器向我显示此线程中的内存泄漏。但我不明白为什么内存泄漏,因为我没有使用任何新的或分配,复制或保留。我用主类附上了我的程序的完整代码。需要有关内存管理的qucik帮助。
我还有一个问题,如果我有一个类将NSString作为数据成员。如果我把它的对象放在NSMutabledictionary中,那么我如何处理这个内存管理。感谢名单
#import <Cocoa/Cocoa.h>
@interface TestA : NSObject {
@public
NSString *strTemp1;
}
@end
#import "TestA.h"
/////////////////////////////////////////////
//Implementation class
@implementation TestA
-(id)init
{
self = [super init];
if (self != nil)
{
//strTemp1 = [[NSString alloc] init];
//printf("\n Temp 1 %d \n", [strTemp1 retainCount]);
}
return self;
}
@end
//Thread Class
#import <Cocoa/Cocoa.h>
#import "TestA.h"
@interface ThreadClass : NSObject {
}
@end
#import "ThreadClass.h"
extern NSMutableDictionary *clData;
@implementation ThreadClass
-(void)Initialize
{
[NSThread detachNewThreadSelector:@selector(AnimateThread:) toTarget:self withObject:nil];
printf("\n<<<<<<<<<<<<<<< Start Animator Thread Called >>>>>>>>>>>>>>>>>>>>>\n");
}
//==========================================================================
- (void) AnimateThread:(id) inObject
{
NSAutoreleasePool *Pool = [[NSAutoreleasePool alloc] init];
NSDate *timeToSleep = [NSDate dateWithTimeIntervalSinceNow:(NSTimeInterval)5];
while (1)
{
//NSAutoreleasePool *threadPool = [[NSAutoreleasePool alloc] init];
printf("\n Collection Size:%d \n", [clData count]);
TestA *obj1 = [clData objectForKey:@"abc"];
printf("\nThread Memory Counter:%d \n", [obj1 retainCount]);
printf("\nThread Memory Counter:%s \n", [obj1->strTemp1 UTF8String]);
//Sleep Thread for 5 Seconds
[timeToSleep release];
timeToSleep = [NSDate dateWithTimeIntervalSinceNow:(NSTimeInterval)5];
[NSThread sleepUntilDate:(NSDate *)timeToSleep];
//[timeToSleep release];
//[threadPool release];
}
[Pool release];
}
@end
//////////////////////////
Main Class
#import <Cocoa/Cocoa.h>
#import "TestA.h"
#import "ThreadClass.h"
NSMutableDictionary *clData = nil;
int main(int argc, char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
clData = [[NSMutableDictionary alloc] init];
//Creating Thread Class
ThreadClass *obj = [ThreadClass new];
[obj Initialize];
[obj release];
TestA *obj1 = [[TestA alloc] init];
NSString *strKey =[NSString new];
strKey = @"abc";
printf("\n Memory Counter:%d \n", [obj1 retainCount]);
printf("\n Memory Counter:%d \n", [obj1->strTemp1 retainCount]);
NSString *strTemp = @"Test Program";
obj1->strTemp1 = [NSString stringWithFormat:@"%s", [strTemp UTF8String]];
[obj1->strTemp1 retain];
printf("\n Memory Counter:%s \n", [obj1->strTemp1 UTF8String]);
[clData setObject:obj1 forKey:strKey];
printf("\nAfter Memory Counter:%d \n", [obj1 retainCount]);
printf("\nAfter Memory Counter:%d \n", [obj1->strTemp1 retainCount]);
[strKey release];
[obj1 release];
[pool release];
return NSApplicationMain(argc, (const char **) argv);
}
答案 0 :(得分:2)
该代码存在大量错误。远远超出了内存管理。
我建议从Objective-C language guide开始,然后转到OS {0}的iOS application architecture guide或Cocoa guide。
一些错误的快速列表:
•通常,您不应该直接使用线程,任何线程都不应该使用while(1) {...sleep(..);...}
轮询构造。应该使用运行循环,队列和GCD。
•retainCount
完全没用。别叫它。有关详细信息,请参阅http://www.whentouseretaincount.com。
•不要通过->
访问实例变量。两者都破坏了封装,而不是在非常罕见的情况下(有时复制对象)在Objective-C中使用的模式。
•这种模式没有意义:NSString *strKey =[NSString new]; strKey = @"abc";
。它泄漏了一个空NSString
的实例(或者无论如何,如果它不是基金会的优化)。没有必要做第一次任务。
•使用main()
中的一堆代码构建一个应用程序然后将控制传递给Cocoa是没有意义的。编写基于Foundation的命令行工具或适当的Cocoa应用程序。
•方法名称以小写字母开头,并且是camelCased。
•看起来你可能会在Cocoa应用程序中做一些动画?如果是这样,您需要阅读Core Animation。
•如果这是一个新项目,请使用ARC。
答案 1 :(得分:0)
使用属性。在标题中:
@interface TestA : NSObject
{
NSString *strTemp1_;
}
@property (nonatomic, copy) NSString* strTemp1;
@end
在实施中:
@synthesize strTemp1=strTemp1_;
-(id)init
{
self = [super init];
if (self != nil)
{
strTemp1_=@"MyString";
}
return self;
}
//since your not using ARC you need to make sure that the property is NIL'd so that it will be released properly.
- (void) dealloc
{
self.strTemp1=NULL;
}