苹果开发 笔记(23)

NSObject的OC里面基础类,在最近的学习当中,越来越发现在OC扮演一种责任很大。 涉及到当中runtime 理解,众多概念又是oc学习的一个难点。
当中的概念有:SEL,Class,IMP。

SEL (方法ID,指向一个objc_selector的指针,表示方法的名字)
IMP (函数指针,方法地址)

在这个过程,既要理解SEL设计的意图,又要去理解OC的消息机制。一下子真的搞昏头脑。在这个过程 我发现例如众多的结构体,可以慢慢形成一个网络。

以objc_XXX 这样方式开头的结构体。

typedef struct objc_class *Class;

typedef struct objc_object *id;

typedef struct objc_method *Method;
struct objc_method_list **methodLists;
struct objc_cache *cache;
struct objc_protocol_list * protocols;

typedef struct objc_selector *SEL;

看看 这些既熟悉 又常用的结构体,不知不觉也用到一部分。

今天在使用IMP的时候,调用的过程却出现一个参数过多问题。直接用IMP 调用出现一些问题,参数过多的情况。
不清楚为什么?
IMP 有一种分支判断的情况。xcode 调用直接出错。

下午重温一下UIView 相关绘图方面的知识,整体来讲API除了有点长外,没有太多难以理解的概念。

#import "MyView.h"
#import <QuartzCore/QuartzCore.h>

@implementation MyView


-(void) drawRect:(CGRect)rect
{
    [self drawAsRect];
    [self drawCircle];
    [self drawEllipse];
    [self drawLine];
}

-(void) drawAsRect
{

  CGContextRef context = UIGraphicsGetCurrentContext();
  //绘图矩形
  CGContextAddRect(context, CGRectMake(50, 100, 200, 100));
  //填充颜色
  CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor);
  //填充路径
  CGContextFillPath(context);

}
-(void) drawCircle
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGRect rect =CGRectMake(0, 0, 80, 80);
    CGContextAddEllipseInRect(context, rect);
   // CGContextFillPath(context); //填充路径
    CGContextStrokePath(context); //只是线条

}

-(void) drawEllipse
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGRect rect =CGRectMake(150, 0, 100, 80);
    CGContextAddEllipseInRect(context, rect);
    CGContextFillPath(context); //填充路径
   // CGContextStrokePath(context); //只是线条
}

-(void) drawLine
{
  CGContextRef context =   UIGraphicsGetCurrentContext();
  CGContextMoveToPoint(context, 260, 0);
  CGContextAddLineToPoint(context, 260, 300);
  CGContextStrokePath(context);
}

@end

绘椭圆和圆形都是使用同一个方法 CGContextAddEllipseInRect ,绘制圆形则rect设置两个相同值即可。

-(void) drawCircle:(CGFloat) x y:(CGFloat)y radius:(CGFloat)radius { CGContextRef context = UIGraphicsGetCurrentContext(); CGRect rect =CGRectMake(x, y, radius, radius); CGContextAddEllipseInRect(context, rect); // CGContextFillPath(context); //填充 CGContextStrokePath(context); //只是线条 } [self drawCircle:20 y:20 radius:20];

你可能感兴趣的:(苹果开发 笔记(23))