doChange 的参数是NSData类型,我以为传入指针,在函数内改变了传入参数的值,函数的最后一行打印的data说明数据已经变了,不过程序的最后一行打印出的body确没有改变。说明函数的参数是值传递而不是地址传递,如何实现地址传递呢
- (void) doChange:(NSData *) data
{
int length = [data length];
int seed = 100;
NSLog(@"%@",data);
NSLog(@"data length:%i",length);
Byte buffer[length];

[data getBytes:buffer] ;

int i;
for(i=0;i<length;i++)
{
buffer[i] = (Byte)(buffer[i] ^ seed);
seed++;
//NSLog(@"%i",buffer[i]);
}
NSData * data2 = [NSData dataWithBytes:buffer length:length];
NSLog(@"%@",data2);
data = data2;
NSLog(@"%@",data);
}[self doChange:body];
NSLog(@"%@",body);

解决方案 »

  1.   


    - (void) doChange:(NSData **) dataPoint
    {
        NSData* data = *dataPoint;

        int length = [data length];
        int seed = 100;
        NSLog(@"%@",data);
        NSLog(@"data length:%i",length);
        Byte buffer[length];
        
        [data getBytes:buffer] ;
        
        int i;
        for(i=0;i<length;i++)
        {
            buffer[i] = (Byte)(buffer[i] ^ seed);
            seed++;
                //NSLog(@"%i",buffer[i]);
        }
        NSData * data2 = [NSData dataWithBytes:buffer length:length];
        NSLog(@"%@",data2);
        *dataPoint = data2;
        NSLog(@"%@",*dataPoint);

    }[self doChange:&body];
    NSLog(@"%@",body);
      

  2.   


    - (void) doChange:(NSData **) dataPoint//
    {
        NSData* data = *dataPoint;//取值
        int length = [data length];
        int seed = 100;
        NSLog(@"%@",data);
        NSLog(@"data length:%i",length);
        Byte buffer[length];
        
        [data getBytes:buffer] ;
        
        int i;
        for(i=0;i<length;i++)
        {
            buffer[i] = (Byte)(buffer[i] ^ seed);
            seed++;
                //NSLog(@"%i",buffer[i]);
        }
        NSData * data2 = [NSData dataWithBytes:buffer length:length];
        NSLog(@"%@",data2);
        *dataPoint = data2;//改变指针指向的值
        NSLog(@"%@",*dataPoint);

    }[self doChange:&body];//传入对象地址
    NSLog(@"%@",body);
      

  3.   

    看来objective-c的指针和C不一样啊
      

  4.   

    汗 怎么跟C不一样啦?只不过cocoa里头所有对象都是指针而已 而看你的代码,你是想在函数中改变对象的指针“值”,所以你必须使用指针的指针才行。
    NSData * data2 = [NSData dataWithBytes:buffer length:length];
        NSLog(@"%@",data2);
        data = data2;你在C中,能直接这样“ data = data2;”地去改变指针的值吗
      

  5.   


    汗,data和data2都是指针,c里边当然是这么改变指针的值,data = data2表示把data和data2指向同一个对象,难道不对吗?
      

  6.   

    当然不对了 C里边你把一个指针当成参数传进函数里,然后在函数里改变这个指针的值(注意,不是改变指针指向的值),就如同data = data2,是根本不会改变指针的内容的。这个时候函数里的这个指针,仅仅是一个int值而已。举个最简单的例子,比如你有一个指针,你想在一个函数中为这个指针申请一块内存:
    void alloc(int *ptr)
    {
     ptr = (int*)malloc(10);
    }
    int main()
    {
    int *p;
    alloc(p);
    }
    你跟我说说,p这个时候的值会变吗
      

  7.   

    扯淡,你用过c的赋值没,data = data1,这时候,data指向的值就是data1指向的值。
      

  8.   

    oc  的指针和c的一样