1

私は UIImageView のサブクラスに取り組んでおり、必要なことの 1 つは、オブジェクトが initWithImage: メッセージで初期化されるときに「コピー」が作成されることです。

ここで何が機能していないのかがわからないので、何か混乱しているに違いありません..

- (id)initWithImage:(UIImage *)image {
[image retain];
if (self = [super initWithImage:image]) {

    if (!maskImage) {
        maskImage = [UIImage imageWithCGImage:[image CGImage]];
        if (maskImage != nil) {
            NSLog(@"Made mask image");
        } else {
            NSLog(@"Failed");
        }
        //maskImage = [UIImage imageNamed:@"image.png"];
    }
}

[image release];
return self;
}

これをビルドしてもエラーは発生せず、マスクイメージが作成されたように見えます (失敗メッセージは表示されません)。ただし、png から割り当てる行のコメントを外すと、機能します。

私は何が欠けていますか?

ありがとう!

4

3 に答える 3

1

次の例では、作成したイメージを保持する必要があります。

- (id)initWithImage:(UIImage *)image {
    if (self = [super initWithImage:image]) {
        if (!maskImage) {
                maskImage = [[UIImage imageWithCGImage:[image CGImage]] retain];
                if (maskImage != nil) {                
                        NSLog(@"Made mask image");
                } else {
                        NSLog(@"Failed");
                }
        }
    }
    return self;
}
于 2009-06-13T09:31:11.960 に答える
0

まず、 maskImage を nil に設定して、ガベージでないことを確認する必要があります。

self.maskImage=nil;

それはあなたのラインを台無しにするかもしれません(今でなければ、後で):

if(!imaskImage)

次に、コピーを作成するには、UIImage サブクラスに NSCopying を実装するだけです。やり方は簡単です。次に、次のように入力できます。

maskImage = [image copy];

または、画像をデータに変換し、アーカイブしてから解凍し、UIImage に戻すこともできます。これにより、イメージの完全なコピーが得られます。これはもう少し複雑ですが、オブジェクト グラフのディープ コピーを作成するために使用される方法と同じです。

于 2009-05-19T22:53:49.347 に答える
0

これを試して。動作するはずです。

- (id)initWithImage:(NSString *)image {
if (self = [super initWithImage:image]) {

        if (!maskImage) {
                img = [UIImage imageNamed:image];
                maskImage = CGImageRetain(img.CGImage);
                if (maskImage != nil) {
                        NSLog(@"Made mask image");
                } else {
                        NSLog(@"Failed");
                }
        }
}

return self;
}
  1. 変更点
    • 画像の代わりに NSString を渡す
    • イメージを保持/リリースする必要はありません
    • .h で img、maskImage を定義する必要があります
    • .h の maskImage には @property に設定された保持プロパティが必要です (例: @property (非原子、保持))
于 2009-05-19T21:26:19.883 に答える