zoukankan      html  css  js  c++  java
  • The property delegate of CALayer cause Crash. 不及格的程序员

    在非arc与arc的环境中使用时,导致程序crash.

     1 //当前类使用-fno-objc 编译
     2 
     3     needle_ = [[MyView alloc] init];
     4 
     5     needleLayer = [CALayer layer];    
     6     needleLayer.delegate = self.needle;
     7 
     8 
     9 - (void)dealloc
    10 {    
    11     [needle_ release];
    12     [needleLayer release];
    13     [super dealloc];   //crash
    14 }
    15     
    1 -(void) drawLayer: (CALayer*) layer inContext: (CGContextRef) context  

    he lightest-wight solution would be to create a small helper class in the the file as the UIView that's using the CALayer:

    In MyView.h

    @interfaceMyLayerDelegate:NSObject...@end

    In MyView.m

    @implementationMyLayerDelegate-(void)drawLayer:(CALayer*)layer inContext:(CGContextRef)ctx
    {...}@end

    Just place those at the top of your file, immediately below the #import directives. That way it feels more like using a "private class" to handle the drawing (although it isn't -- the delegate class can be instantiated by any code that imports the header).

    Feedback
     
    2012-11-09 11:51 | 为了谁  
    needleLayer.delegate = nil;这句话写在dealloc中,因为CALayer中的delegate是assign的属性,这样你释放[needle_ release];后,deletate就是野指针了。在arc中如果有weak了,如果delegatej是weak的属性,就不会crash..

    我们在程序设计中也要注意传指针。

      回复引用删除
    #2楼[楼主]
    2012-11-14 15:07 | 不及格的程序员-八神  
    @ 为了谁
    请教一下,为什么视图已经在delloc中了,它还会访问用CALayer的delegate呢?

     

  • 相关阅读:
    springmvc的执行流程
    深入理解设计模式(五):抽象工厂模式
    深入理解设计模式(四):工厂方法模式
    深入理解设计模式(三):策略模式
    写给三十岁的自己
    asp.net引用System.Speech实现语音提示
    深入理解设计模式(序):常用的7大设计原则
    深入理解设计模式(二):简单工厂模式
    深入理解设计模式(一):单例模式
    解决基于IIS的.net core HttpWebRequest 连接特别慢
  • 原文地址:https://www.cnblogs.com/ioriwellings/p/2759884.html
Copyright © 2011-2022 走看看