2

ポインタに問題があるようで、修正できないようです。誰か助けてくれませんか?

-(void) connectionDidFinishLoading:(NSURLConnection *)connection{
    NSLog(@"Finished Downloading Image: %@" ,[connection.originalRequest.URL absoluteString]);
    UIImage *CompiledImage=[UIImage imageWithData:ImageData];
    SEL selector=@selector(ImageDownloadingCompleted:Image:);
    if([[self Delegate] respondsToSelector:selector]){
        [[self Delegate] ImageDownloadingCompleted:self Image:CompiledImage];
    }
    else{
        if(Target){
            *Target=CompiledImage;
        }
    }
    // NSLog(@"Image Size:%i", [ImageData length]);
}

Targetは型のプライベート変数UIImage(宣言されたUIImage *Target;:) CompiledImageUIImage同様です。私がやりたいのは、ターゲットのアドレスの内容をCompiledTargetの内容に設定することです。これにより、次のエラーが発生します。

互換性のないタイプ「UIImage*__strong」から「UIImage」に割り当てる

私は試した :

memccpy(__bridge Target, &CompiledImage, sizeof(Target),sizeof(Target));

そして私はこのエラーを受け取ります:

期待される表現

4

3 に答える 3

5

次のように設定する必要があります。

Target = CompiledImage;

の必要はありません*。どちらも基本的にポインターであるため、上記のコードを使用する場合、メモリアドレスを割り当て、内容をコピーしません。

ちなみに、変数名は小文字で始めてください。Target通常、クラス名を表します。Apple コーディング規約に従って、それはtarget.

あなたのコメントによると、次のことができます。

ViewController クラスで、 aUIImageを として宣言します@property

@property (nonatomic, retain) UIImage *downloadedImage;

URL呼び出しをしている間、

NSImageLoader *imageLoader = [[NSImageLoader alloc] init];
[imageLoader setTarget:self];//setting current viewController as target instead of UIImage

画像をダウンロードすると、

-(void) connectionDidFinishLoading:(NSURLConnection *)connection{
    NSLog(@"Finished Downloading Image: %@" ,[connection.originalRequest.URL absoluteString]);
    UIImage *CompiledImage=[UIImage imageWithData:ImageData];
    SEL selector=@selector(ImageDownloadingCompleted:Image:);
    if([[self Delegate] respondsToSelector:selector]){
        [[self Delegate] ImageDownloadingCompleted:self Image:CompiledImage];
    }
    else{
        if(Target){
            Target.downloadedImage = CompiledImage;//or [Target setDownloadedImage:CompiledImage];
        }
    }
    // NSLog(@"Image Size:%i", [ImageData length]);
}

ViewController クラスで、同じ場所を指している同じメモリ アドレスをself.downloadedImage持つイメージとしてアクセスできるようになりました。CompiledImage

別の方法は、クラスでUIImage *Targetasを宣言することです。メソッドの呼び出し中に、 を使用します。このメソッド内で、ターゲットを次のように設定する必要がありますUIImage **TargetNSImageLoadersetTarget[imageLoader setTarget:&Target];Target = Target;

更新: コメントに基づいて、次のようになります。

for( NSDictionary *CurrentActivity in [Profile UserActivities]) {
        ...
        UIImage *WineImage = [UIImage imageNamed:@"loader.gif"];
        NSImageLoader *loader=[[NSImageLoader alloc] initWithURLString:[NSString stringWithFormat:@"%@%@",[TempSettings URL],[CurrentActivity objectForKey:@"ImageURL"]]];
        [loader setTarget:&WineImage];
        [loader startDownloading];
        [self addSubview:Activity];
        Counter++;
    }

次に、NSImageLoader.h ファイル @interface で、

 __strong UIImage **Target; //This should be strong not autoreleasing

NSImageLoader.m ファイルで、

- (void)setTarget:(UIImage *__strong *)iTarget{ //change here also
     Target = target; 
} 


-(void) connectionDidFinishLoading:(NSURLConnection *)connection{
    NSLog(@"Finished Downloading Image: %@" ,[connection.originalRequest.URL absoluteString]);
    UIImage *CompiledImage=[UIImage imageWithData:ImageData];
    SEL selector=@selector(ImageDownloadingCompleted:Image:);
    if([[self Delegate] respondsToSelector:selector]){
        [[self Delegate] ImageDownloadingCompleted:self Image:CompiledImage];
    }
    else{
        if(Target){
            *Target = CompiledImage;
        }
    }
    // NSLog(@"Image Size:%i", [ImageData length]);
}

アップデート2:

UIImageView を渡すアプローチを使用すると、次のことができます。

    for( NSDictionary *CurrentActivity in [Profile UserActivities]) {
        ...
        UIImage *WineImage = [UIImage imageNamed:@"loader.gif"];
        NSImageLoader *loader=[[NSImageLoader alloc] initWithURLString:[NSString stringWithFormat:@"%@%@",[TempSettings URL],[CurrentActivity objectForKey:@"ImageURL"]]];
        [loader setTarget:Activity];//pass imageview and let the delegate method set image
        [loader startDownloading];
        [self addSubview:Activity];
        Counter++;
    }

-(void) connectionDidFinishLoading:(NSURLConnection *)connection{
    NSLog(@"Finished Downloading Image: %@" ,[connection.originalRequest.URL absoluteString]);
    UIImage *CompiledImage=[UIImage imageWithData:ImageData];
    SEL selector=@selector(ImageDownloadingCompleted:Image:);
    if([[self Delegate] respondsToSelector:selector]){
        [[self Delegate] ImageDownloadingCompleted:self Image:CompiledImage];
    }
    else{
        if(Target){
            Target.image = CompiledImage;
        }
    }
    // NSLog(@"Image Size:%i", [ImageData length]);
}

ここで imageview を渡し、イメージをダウンロードしたらデリゲート メソッドでイメージを設定します。

于 2012-12-09T12:07:36.720 に答える
1

ターゲットを pTarget にしますか? ポインタへのポインタ、それは理にかなっています *pTarget = compiledImage (NSErrorsで頻繁に行われるため..コアデータなど)

ターゲットにはヒープに適切なサイズが割り当てられていないため、単に memcpy することはできません。


メモリ内の実際の UIImage バイトをコピーすることはできません。これは、実装の詳細がわからないためです。あなたはそれがどれほど大きいかさえ知りません!

しかし、ポインタを画像にコピーすることができます - そのメモリアドレス


UIImage *pointer1 = [UIImage imageWithFoo];
UUImage *pointer2 = pointer1;

空のポインターを宣言して、後で埋めることもできるようになりました

UIImage *target = nil;
UIImage *pointer1 = [UIImage imageWithFoo];
target = pointer1;

ここまではうまくいきましたが、関数にターゲットを渡したい場合はどうすればよいでしょうか?

target = [self calculateImage];

しかし、今では非同期関数でそれを持っています

[self asyncCalculateImage:&target]; // you pass it a POINTER to the POINTER to fill :)
...
- (void)asyncCalculateImage:(UIImage**)pTarget {
    UIImage *pointer1 = [UIImage imageWithFoo];
    *pTarget = pointer1; //DEREFERENCE and fill pTarget
}
于 2012-12-09T20:13:58.967 に答える
0

なぜまた * を入れたのか、ここでは CompiledImage 自体がポインターです。

単に使用するTarget=CompiledImage;

于 2012-12-09T12:08:24.350 に答える