菜鸟教程小白 发表于 2022-12-13 11:42:48

ios - CGPathRef 与 CGmutablePathRef


                                            <p><p>在 iOS 中有两个 C 结构表示描述可绘制形状的路径:CGPathRef 和 CGMutablePathRef。从他们的名字看来,CGPathRef 指的是一个一旦创建就不能更改的路径,而 CGMutablePathRef 指的是一个可修改的路径。但是,事实证明,可以将 CGPathRef 传递给需要 CGMutablePathRef 的函数,在我看来,唯一的区别是前者会在传递给它的函数修改路径时生成警告,而后者不会吨。例如下面的程序:</p>

<pre><code>#import &lt;UIKit/UIKit.h&gt;

@interface TestView : UIView {
    CGPathRef immutablePath;
    CGMutablePathRef mutablePath;
}
@end
@implementation TestView

- (id)initWithFrame:(CGRect)frame
{
    self = ;
    if (self) {
      mutablePath = CGPathCreateMutable();
      immutablePath = CGPathCreateCopy(mutablePath); // actually you might just do &#34;immutablePath = CGPathCreateMutable();&#34; here - The compiler doesn&#39;t even complain

      self.backgroundColor = ;
    }

    return self;
}


- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@&#34;touchesBegan executed!&#34;);
    ;
}

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextAddPath(context, immutablePath);
    CGPathAddRect(immutablePath, NULL, CGRectMake(100.0, 100.0, 200.0, 200.0)); // generates a warning specified later
    CGContextFillPath(context);
}


@end


@interface TestViewController : UIViewController
@end

@implementation TestViewController

@end

@interface AppDelegate : UIResponder &lt;UIApplicationDelegate&gt;

@property (strong, nonatomic) UIWindow *window;

@end

@implementation AppDelegate

@synthesize window = _window;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [ initWithFrame:[ bounds]];
    // Override point for customization after application launch.
    self.window.backgroundColor = ;

    // Instantiate view controller:
    TestViewController *vc = [ init];
    vc.view = [ initWithFrame:.bounds];
    self.window.rootViewController = vc;
    ;
    return YES;
}
@end


int main(int argc, char *argv[])
{
    @autoreleasepool {
      return UIApplicationMain(argc, argv, nil, @&#34;AppDelegate&#34;);
    }
}
</code></pre>

<p>这是编译器给出的警告:
<strong>将“CGPathRef”(又名“const struct CGPath *”)传递给“CGMutablePathRef”(又名“struct CGPath *”)类型的参数会丢弃限定符</strong></p>

<p>也许我在这里漏掉了重点,但这两者之间还有什么其他区别,除了提醒程序员他可能不打算修改被引用的路径(由 CGPathRef)吗?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>在 C 中可以将错误的类型传递给函数,但这几乎总是不是一个好主意。即使从技术上讲,它们似乎被定义为同一个东西,但苹果将它们作为独立的东西可能是有充分理由的。很可能是为了使代码更具可读性和可理解性,或者 Apple 计划稍后进行更改。</p>

<p>毕竟,跳转到定义会揭示真正的差异:</p>

<pre><code>typedef struct CGPath *CGMutablePathRef;
typedef const struct CGPath *CGPathRef;
</code></pre>

<p><code>CGPathRef</code> 是一个 <code>const typedef</code> (如果您不太确定这是做什么的,请在 Google 上搜索)。但是,C 允许您破坏 const 定义,这就是为什么您仍然能够将 <code>CGPathRef</code> 传递给期望 <code>CGmutablePathRef</code> 的函数并对其进行修改的原因。它还解释了为什么它会引发 <code>discards qualifiers</code> 警告。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - CGPathRef 与 CGmutablePathRef,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/9321462/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/9321462/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - CGPathRef 与 CGmutablePathRef