我在找到目标c中的内存泄漏以及如何修复它们方面有点新意。我知道如何使用alloc / init / copy和release / retain但是(至少我是这么认为:-))但是我的IOS应用程序中有一些奇怪的内存泄漏。
-(void) sendStats {
// read the app settings
plistHandler *readData = [[plistHandler alloc] init];
[readData setPlistName:@"Settings"];
NSDictionary *settingsArray = [readData readPlist];
[readData release];
NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterDecimalStyle];
NSNumber * myNumber = [f numberFromString:[NSString stringWithFormat:@"%@", [settingsArray objectForKey:@"range"]]];
[f release];
int rangeForUrl;
if(myNumber != nil) {
rangeForUrl = [myNumber intValue];
} else {
rangeForUrl = 10;
}
// get uniqe device ID
UIDevice *getdev = [UIDevice currentDevice];
NSString *uniqueIdentifier = [getdev uniqueIdentifier];
NSString *deviceId = [NSString stringWithFormat:@"IOS-%@", uniqueIdentifier];
// get the unix timestamp
NSDate * past = [NSDate date];
NSTimeInterval oldTime = [past timeIntervalSince1970];
NSString * unixTime = [[[NSString alloc] initWithFormat:@"%0.0f", oldTime] autorelease];
// send the data with a post request to the API
HttpRequest *data = [[HttpRequest alloc] init];
data.postData = [NSString stringWithFormat:@"&device=%@&age=%@&gender=%@&latitude=%@&longitude=%@×tamp=%@", deviceId, [settingsArray objectForKey:@"age"], [settingsArray objectForKey:@"gender"], @"00", @"00", unixTime];
data.controller = @"sendDevice";
NSString *url = [NSString stringWithFormat:@"http://www..eu/api/send_device"];
[data loadHostName:url];
[data release];
//NSLog(@"string s: %@", data.postData);
}
这是根据Xcode instruments =>的内存泄漏。泄漏:
泄露的对象#地址大小负责的图书馆负责框架 NSCFString,0x16cb40 144字节基础 - [NSPlaceholderString initWithFormat:locale:arguments:]
这是我的代码中带有“data.postData = ...”的行。有人可以帮助我吗?
这就是我在httpRequest类中使用postData的方法:
- (void)loadHostName:(NSString *)hostName {
responseData = [[NSMutableData alloc] init];
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@", hostName]];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
if(authString) {
[request setValue:authString forHTTPHeaderField:@"Authorization"];
}
if([postData isKindOfClass:[NSString class]] && postData != @"") {
NSData *dataToPost = [postData dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *postLength = [NSString stringWithFormat:@"%d",[dataToPost length]];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Current-Type"];
[request setHTTPBody:dataToPost];
}
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[connection release];
}
当然:
NSString * postData; @property(nonatomic,retain)NSString * postData;
和
@synthesize postData;
答案 0 :(得分:1)
您需要在postData
中发布dealloc
。
现在看起来像是固定的。但我真的不明白dealloc是如何工作的。我从来没有做过 postData上的alloc / init。这是否意味着我.h文件中的每个对象都像 postData需要在.m文件的dealloc中发布吗?
说到属性,您需要在dealloc
中释放所有属性而不是标记为assign
(以及您拥有的任何非属性实例变量)。非assign
属性拥有支持实例变量所拥有的对象,因此您需要通过在dealloc中发送release
消息来放弃对其的所有权。
来自"The Objective-C Programming Language":
声明的属性以及@synthesize指令接受 存取方法声明的地方;当你合成一个属性时 编译器根据需要创建访问器方法。但是,没有 属性声明和dealloc之间的直接交互 不会自动为您释放method-properties。声明 但是,属性确实提供了一种交叉检查的有用方法 你的dealloc方法的实现:你可以找到所有的 头文件中的属性声明并确保该对象 未标记分配的属性将被释放,标记为分配的属性将被释放 没有被释放。