Objective c NSString内存泄漏

Objective c NSString内存泄漏,objective-c,ios,memory-management,memory-leaks,nsstring,Objective C,Ios,Memory Management,Memory Leaks,Nsstring,我对在objective c中发现内存泄漏以及如何修复它们有点陌生。我知道如何使用alloc/init/copy和release/retain,但(至少我这么认为:-)我的IOS应用程序中有一些奇怪的内存泄漏 -(void) sendStats { // read the app settings plistHandler *readData = [[plistHandler alloc] init]; [readData setPlistName:@"Settings"]; NSDicti

我对在objective 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=%@&timestamp=%@", 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=>leaks,这是内存泄漏:

泄漏对象#地址大小负责库负责帧 NSCFSCOPE,0x16CB40 144字节基础- [ NStPosiHeldStuleStudioInItFieldFrase:LoaLa:Dista::/P> 这是代码中带有“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; @属性(非原子,保留)NSString*postData


@综合后期数据

您需要在
dealloc
中释放
postData

看起来它现在修好了。但我真的不明白dealloc是如何工作的。我从来没有做过一件事 postData上的alloc/init。这是否意味着.h文件中的每个对象都像 postData是否需要在.m文件的dealloc中发布

说到属性,您需要在
dealloc
中释放所有标记为
assign
(以及您拥有的任何非属性实例变量)的属性not。非
assign
properties拥有支持实例变量持有的对象,因此您需要通过在dealloc中向其发送
release
消息来放弃对该对象的所有权

发件人:

声明的属性以及@synthesis指令采用 访问器方法声明的位置;当你合成一个属性时, 编译器根据需要创建访问器方法。然而,这是不可能的 属性声明和dealloc之间的直接交互 方法属性不会自动为您发布。宣布 但是,属性确实提供了一种有用的方法来交叉检查 dealloc方法的实现:您可以查找所有 在头文件中声明属性,并确保 未标记为assign的属性将被释放,标记为assign的属性将被释放 没有释放


我还建议您阅读。

您需要在
dealoc
中发布
postData

看起来它现在修好了。但我真的不明白dealloc是如何工作的。我从来没有做过一件事 postData上的alloc/init。这是否意味着.h文件中的每个对象都像 postData是否需要在.m文件的dealloc中发布

说到属性,您需要在
dealloc
中释放所有标记为
assign
(以及您拥有的任何非属性实例变量)的属性not。非
assign
properties拥有支持实例变量持有的对象,因此您需要通过在dealloc中向其发送
release
消息来放弃对该对象的所有权

发件人:

声明的属性以及@synthesis指令采用 访问器方法声明的位置;当你合成一个属性时, 编译器根据需要创建访问器方法。然而,这是不可能的 属性声明和dealloc之间的直接交互 方法属性不会自动为您发布。宣布 但是,属性确实提供了一种有用的方法来交叉检查 dealloc方法的实现:您可以查找所有 在头文件中声明属性,并确保 未标记为assign的属性将被释放,标记为assign的属性将被释放 没有释放


我还建议您阅读。

如何声明
postData
?postData是httpRequest类中带有@property(nonatomic,retain)NSString*postData和synthesis postData的NSString。@Melvin您是否在
dealoc
中发布
postData
?@albertamgthnx,看起来它现在已修复。但我真的不明白dealloc是如何工作的。我从未对postData执行过alloc/init。这是否意味着我的.h文件中的每个对象(如postData)都需要在.m文件的dealoc中释放?有人知道这门课的好教程吗?@Melvin我给出了答案。过来看。我希望它能有所帮助。您是如何声明
postData
?postData是类httpRequest中带有@property(非原子,retain)NSString*postData的NSString,并合成postData。@Melvin您是否在
dealloc
中发布
postData
?@AlbertamgThnx,看起来它现在已经修复了。但我真的不明白dealloc是如何工作的。我从未对postData执行过alloc/init。这是否意味着我的.h文件中的每个对象(如postData)都需要在.m文件的dealoc中释放?有人知道这门课的好教程吗?@Melvin我给出了答案。过来看。我希望有帮助。