0

I don't truly understand the difference between weak and strong pointer. It doesn't cause any big problem until now I am following an example in the documentation, making an NSURLRequest and use it in NSURLConnection to received data.

The code is like this:

    //create the request with url
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://localhost:3000/students.json"]];

    //create the with the request
    NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];


    if (connection) {
        //create NSData instance to hold data if connection is successfull
        self.receivedData = [[NSMutableData alloc]init];
//        NSLog(@"%@",@"Connection successfully");
    }
    else{
        NSLog(@"%@",@"Connection failed");
    }

SO I append data into receivedData in the body of delegate method.

@property (strong,nonatomic) NSMutableData *receivedData;

//delegate method
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    [self.receivedData appendData:data];
    NSLog(@"%@",@"Receiving Data");
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
    NSLog(@"Succeeded! Received %d bytes of data",[self.receivedData length]);
}

the code I posted above is working:) because I have just fixed it.

My question is - The type of the pointer was original weak. I would always get 0 bytes of data from [self.receivedData length] before I have changed the type of pointer from weak to strong and I don't understand why it can't hold the data.

4

2 に答える 2

2

弱参照はその内容を保持しません。作成した可変データ オブジェクトを参照するように変数に指示していreceivedDataましたが、それを保持するようには指示していませんでした。したがって、そのifブロックが完了すると、データのスコープは終了し、ARC はそれを解放しました。それを保持しているものは他になかったので、割り当てが解除され、指すものがないため、recrivedData は nil に設定されました。[self.receivedData length]nil だったので 0 (技術的self.receivedDataには nil) を返しました。receivedData をストロングと宣言することで、それが指し示すオブジェクトを保持するように指示し、処理が完了するまでそのオブジェクトが確実に存在するようにします。

于 2012-10-08T04:43:34.447 に答える
2

それを使用してデータを取得してみてください

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://localhost:3000/students.json"]]];

NSURLResponse *response;
NSError *error;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSString *strResponse = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
//    NSLog(@"%@",strResponse);

SBJSON *sbJason = [[SBJSON alloc] init];
NSMutableDictionary *getNameList = [sbJason objectWithString:strResponse]; 
于 2012-10-08T04:51:39.260 に答える