Cricum.h” (圆的周长面积及是否相交)

#import <Foundation/Foundation.h>

 

@interface Circum : NSObject

@property double r;

@property CGPoint o;

@property (readonly) double s;   //把面积作为一个属性(只读代表只能访问_s)

@property (readonly) double c;    //把周长作为一个属性(_c)

-(instancetype)initWithR:(double)r O:(CGPoint)o; //自定义初始化方法

-(BOOL)isCoverOtherCircum:(Circum*)y;//判断两圆是否相交的方法

@end

 “Circum.m”

#import "Circum.h"

 

@implementation Circum

//带有监听的初始化方法:1.创建键值观察方法2.键值回调3.释放dealloc

- (instancetype)initWithR:(double)r O:(CGPoint)o

{      //谁   让         谁    观察哪一个属性(1.键值观察的方法)

    [self addObserver:self forKeyPath:@"r" options:NSKeyValueObservingOptionNew context:@"r"];

    

    self = [super init];

    if (self)

    {

        self.o=o;

        self.r=r;

        _s=3.14*r*r;

       _c=3.14*2*r;

    }

    return self;

}

 

 //2.键值回调的方法

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

{

    NSString * con=(__bridge NSString *)context;

    if ([con isEqualToString:@"r"])

    {

        NSNumber *r_con=change[@"new"];

        double r=[r_con doubleValue];

        _s=r*r*3.14;  //s是只读属性,无法赋值,可用_s内部变量

        _c=2*r*3.14;

        

        

    }

}

//3.释放dealloc

-(void)dealloc

{

    [self removeObserver:self forKeyPath:@"r"];

 

}

//判断两圆是否相交的方法

-(BOOL)isCoverOtherCircum:(Circum*)y  //y是同种类型的对象

{

    double d=(y.o.x-self.o.x)*(y.o.x-self.o.x)+(y.o.y-self.o.y)*(y.o.y-self.o.y);

    double r1=(self.r+y.r)*(self.r+y.r);

    if (r1>d)

    {

        return  true;

    }

    else

        return    false;

    

}

 

 

/*  ***************不带监听的初始化方法(对象的r值不能改变)**************

- (instancetype)initWithR:(double)r O:(CGPoint)o//CGPoint是一个结构体,有float x,float y。

{

    self = [super init];

    if (self) {

        self.r=r;

        self.o=o;

        _s=self.r*self.r*3.14;  //s是只读属性,无法赋值,可用_s内部变量

        _c=2*self.r*3.14;

 

        

    }

    return self;

}

*/

 

@end

 “main.m”

#import <Foundation/Foundation.h>

#import "Circum.h"

/*

 1,类的声明

 2,属性声明(成员变量,内部数据)

 (属性控制符:线程同步类,内存模式,读写权限)

 3,方法声明及实现

 4,对象的创建

 5,对象通过点语法调用属性

 6,对象直接调用方法

 

 7,自定义初始化方法

 8,便利构造器方法(之前很重要,现在不重要)

 9,self关键字

 

 10,键值编码:古老赋值方式

 11,键值观察

 12,销毁处理

 

 */

 

int main(int argc, const char * argv[]) {

    @autoreleasepool {

        Circum *c=[[Circum alloc]initWithR:2 O:CGPointMake(8, 10)];

        NSLog(@"%g\n",c.c);      //周长被定义为属性,可用.操作

        //  c.r=5;              //不用键值监听,半径无法改变,监听后r可以改变

        //NSLog(@"%g\n",c.c);

        Circum *c1=[[Circum alloc]initWithR:3 O:CGPointMake(4, 5)];

        NSLog(@"%g\n",c1.c);

        Circum *c2=[[Circum alloc]initWithR:4 O:CGPointMake(3,4)];

        NSLog(@"%g\n",c2.s);

                           

      if ([c isCoverOtherCircum:c1])

        {

            NSLog(@"圆c与圆c1相交!\n");

        

        }

        else

        {

        

        

            NSLog(@"圆c与圆c1不相交\n");

 

        }

    

    

 }

    return 0;

    

}