Apple の脅威の通知と金銭目当てのスパイウェアへの対策について

しばらく返答が寄せられていないようです。 再度ディスカッションを開始するには、新たに質問してください。

[Xcode]仮引数がnilになる.

Mac mini 2018 / macOS mojave 10.14.6 / Xcode Version 11.3.1 (11C505) / Objective-C を使用しています.


実引数はたしかにnilでないはずなのですが、仮引数はnilとなっておりエラーが発生します.こういったことは今までなかったので戸惑っています.どう書けばこのエラーは解消されるでしょうか?


Xcodeにはずいぶん慣れてきたような思いますが、まだまだ不慣れといえるので、前提の説明などが不足していたらすいません.


AppDelegate.h

#import <Cocoa/Cocoa.h>
#import "NewColor.h"
@interface AppDelegate : NSObject <NSApplicationDelegate>
@end


AppDelegate.m

#import "AppDelegate.h"
#import <AppKit/AppKit.h>
@interface AppDelegate ()
@end
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    NSColor *color;
    NSColor *returnColor;
    CGFloat components;
    color = [NSColor redColor];
    NSLog(@"color desc : %@", [color description]);
    [color getComponents:&components];
    NSLog(@"components = %f", components);
    returnColor = [NewColor copyColor:color];
    NSLog(@"returnColor desc : %@", [returnColor description]);
}
- (void)applicationWillTerminate:(NSNotification *)aNotification {
}
@end


NewColor.h

#import <Cocoa/Cocoa.h>
#import <AppKit/AppKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface NewColor : NSObject
+ (NSColor *)copyColor:(NSColor *)color;
@end
NS_ASSUME_NONNULL_END


NewColor.m

#import "NewColor.h"
@implementation NewColor
+ (NSColor *)copyColor:(NSColor *)color {
    CGFloat components;
    [color getComponents:&components];
    NSLog(@"copyColor: desc %@", [color description]);
    return [NSColor colorWithColorSpace:[color colorSpace]
                             components:&components
                                  count:[color numberOfComponents]];
}
@end


出力されたログ

Metal API Validation Enabled
color desc : sRGB IEC61966-2.1 colorspace 1 0 0 1
components = 1.000000
copyColor: desc (null) ← なぜに nil ??
2023-10-30 08:43:16.286435+0900 EXC_BAD_ACCESS (code=EXC_I386_GPFLT)[5875:486953] *** nil colorspace argument in initWithColorSpace:components:count:


Mac mini, macOS 10.14

投稿日 2023/10/30 09:08

返信
返信: 11

2023/10/31 06:06 品川地蔵 への返信

おはようございます。。


>品川地蔵さん

あ、なるほど。

colorSpaceの型が間違ってるわけですね。


CGFloat components[4];


として、

[color getComponents:components];


NSLog(@"components(RGBA) = %f %f %f %f", components[0],components[1],components[2],components[3])


とでもすれば・・・・・いいのかな??


2023/10/30 20:32 light289 への返信

環境が違うので参考にならないかもしれませんが。。


HighSierra

clang-1000.11.45.5


xCodeは使わず、

AppDelegate を main関数に変えて、CommandLineからmakeしてみました。


[実行結果]

2023-10-30 20:27:53.376 test[36773:53437823] color desc : sRGB IEC61966-2.1 colorspace 1 0 0 1

2023-10-30 20:27:53.376 test[36773:53437823] components = 1.000000

2023-10-30 20:27:53.376 test[36773:53437823] copyColor: desc sRGB IEC61966-2.1 colorspace 1 0 0 1

2023-10-30 20:27:53.377 test[36773:53437823] returnColor desc : sRGB IEC61966-2.1 colorspace 1 0 0 1


となりました。

ちゃんと同じ結果が出てますねぇ・・・・ うーむ。


2023/11/05 17:51 品川地蔵 への返信

AppDelegate.m

#import "AppDelegate.h"
#import <AppKit/AppKit.h>
@interface AppDelegate ()
@end
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    NSColor *color;
    NSColor *returnColor;
    color = [NSColor redColor]; // sRGB 赤色
    NSLog(@"color desc : %@", [color description]);
    returnColor = [NewColor copyColor:color];
    NSLog(@"returnColor desc : %@", [returnColor description]);
    color = [NSColor grayColor]; // グレースケール 灰色
    NSLog(@"color desc : %@", [color description]);
    returnColor = [NewColor copyColor:color];
    NSLog(@"returnColor desc : %@", [returnColor description]);
}
- (void)applicationWillTerminate:(NSNotification *)aNotification {
}
@end


NewColor.m

#import "NewColor.h"
@implementation NewColor
+ (NSColor *)copyColor:(NSColor *)color {
    NSUInteger numberOfComponents = [color numberOfComponents];
    CGFloat components[numberOfComponents];
    [color getComponents:components];
    return [NSColor colorWithColorSpace:[color colorSpace]
                             components:components
                                  count:[color numberOfComponents]];
}
@end


出力されたログ

Metal API Validation Enabled
color desc : sRGB IEC61966-2.1 colorspace 1 0 0 1
returnColor desc : sRGB IEC61966-2.1 colorspace 1 0 0 1
color desc : Generic Gray Gamma 2.2 Profile colorspace 0.5 1
returnColor desc : Generic Gray Gamma 2.2 Profile colorspace 0.5 1


ヘッダーファイルは変わりないので省略しました.あとコンポーネント値の表示も必要ないと思い省略しています.


品川地蔵さんがおっしゃるようにカラーコンポーネントの最大が5だとしても、どうしてもCGFloat components[5]としたくなかったので、何か他の方法はないかなーと探していたらよい発見がありました.以下の部分です.

NewColor.m

    NSUInteger numberOfComponents = [color numberOfComponents];
    CGFloat components[numberOfComponents];


C言語をそれほど深く学んでいないのですが、こういった宣言と初期化ができると思っていなかったので拍子抜けしました.この書き方はObjective-C特有の書き方なのでしょうか.それともこれも「たまたま動いた」の類いなのでしょうか..


さて質問への回答ですが、「RGBAで4コンポーネントなのにCGFloat components;ではどこかを壊しますよ。」ということですかね.そういうことであれば嬉しいのですが.


ともあれみなさま、いろいろありがとうございました.

品川地蔵 さんによる書き込み:

getComponents では先頭から入れ込むだけなので、
CGFloat components[4] で問題ないですよ。
汎用性を考えれば、カラーコンポーネントの最大は5なので
CGFloat components[5] としておくべきです。
それ以外変更する必要はないですよ。
return行もコンポーネント数を参照しているのでそのままでいいです。


2023/11/05 22:15 light289 への返信

     NSUInteger numberOfComponents = [color numberOfComponents];
    CGFloat components[numberOfComponents];

もちろんこれで間違いはないのですが、内部的には malloc() でメモリ割り当てをするわけで、

パフォーマンスが悪くなりますよ。最大5個というのがわかっているので、

最初から CGFloat components[5] で割り当ててしまった方が良いですね。

最大幾つになるかわからない場合は上の方法で良いのですが。

まぁ、今回の例で言えば

[NSColor colorWithColorSpace:[color colorSpace]

components:components

count:[color numberOfComponents]];

の処理に比べれば大したことはないと言えるかとは思いますが。

2023/11/06 19:55 品川地蔵 への返信

最大が5というのはおそらく変わらないのでしょうが、そこは、まあ、なんとなくモヤモヤするというのか好みの問題というのか、パフォーマンスを気にしないならわかりよい方を選ぶ、ということになりますかね.あとこれは余計な心配かもしれませんが、世の中には6色印刷なるものもありますし、アルファがなければ6、あれば7とか、そんな色空間が追加されたら詰むなぁ、と、これ以上は本題から離れてしまう関係上、割愛します.ともあれ、ご指摘は感謝しています.

2023/10/31 07:55 light289 への返信

getComponents では先頭から入れ込むだけなので、

CGFloat components[4] で問題ないですよ。

汎用性を考えれば、カラーコンポーネントの最大は5なので

CGFloat components[5] としておくべきです。

それ以外変更する必要はないですよ。

return行もコンポーネント数を参照しているのでそのままでいいです。

2023/10/31 07:43 品川地蔵 への返信

おっしゃるとおり CGFloat components[4] とすれば動いたのですが、これ、グレースケールの場合は [2] とすべきなので、いささか汎用性に欠けるのかと..

修正したコードを書いているところなので、できたらまたここに上げます.

[Xcode]仮引数がnilになる.

Apple サポートコミュニティへようこそ
Apple ユーザ同士でお使いの製品について助け合うフォーラムです。Apple ID を使ってご参加ください。