您的位置:首页 > 职场人生

OC基础语法(三)---核心语法(1)

2014-12-21 16:08 597 查看
一、点语法

    
格式:   p.age = 10;  即  [p aetAge:10];
int a = p.age;  即  [p age];
   点语法的本质还是方法调用,并不是访问成员变量。
在OC中访问成员变量,只有 p->—_age;

成员变量的作用域:
@public :在任何地方的都能直接访问对象的成员变量
@private:只能在当前类的对象方法中直接访问
@protected:只能在当前类和子类的对象方法中直接访问
@package:只要处在一个同一个框架中,就能直接访问对象的成员变量

注:写在类的.m文件中的成员变量默认就是私有(private);
    写在类的.h文件中的成员变量默认是protected.
    OC中:类是单继承。

二、property和 synthesize
    
编译器特性:
@property:可以自动生成某个成员变量的setter和getter 声明;
例:  @property int age;
      即: - (void)setAge:(int)age;
           - (int)age;
      
@synthesize:自动生成成员变量的setter 和 getter 实现,并且会访问这个成员变            
             量;
例:  @synthesize age = _age;
      若是: @synthesize age;默认会访问age这个成员变量,如果没有age,就会
             自动生成private age。

可以简写:(类型相同时)
@property int speed,wheels;
@synthesize speed = _speed,wheels = _wheels;
注:xCode 4.4 以后:可以支持简写:
    @property int speed;  //包含了方法的声明和实现,_speed成员变量的声明;
    缺点:默认的成员变量是私有的,要想子类对象能访问,必须写声明: int _speed;
关于synthetic的手动实现:
1.若手动实现了setter,编译器就会自动生成getter;
2.若手动实现了getter,编译器就会自动生成setter;
3.若同时手动实现了setter和getter,编译器就不会 自动生成不存在的成员变量。

    id 关键字:万能指针,能指向操作任何OC对象。

三、构造方法
    
定义:用来初始化对象的方法,是个对象方法,“-”开头。
      例: Person *p = [Person new];
           可分为两步初始化:
           Person *p1 = [Person alloc];//分配存储空间
           Person *p2 = [Person init];//调用 -init进行初始化
           合并为:
           Person *p = [[Person alloc] init];

重写构造方法的目的: 为了让对象创建出来吗,成员变量就有一些固定的值。
重写init 方法例子:
           - (id)init
          { // 一定要调用回super 的 init 方法:初始化父类中声明色一些成员变
            // 量和其他属性
               self = [super init];
            //如果对象初始化成功,才有必要进行接下来的初始化
              if(self != nil)
              {//初始化成功
                 _age = 10;
              }
            //返回一个已经初始化完毕的对象
             return self; 
          }
最简洁代码:
        - (id)init
        {
           if(self = [super init])
           {
               _age = 10;
            }
           return  self;
        }

重写构造方法的注意点:
1.先调用弗雷德构造方法;
2.再进行子类内部成员变量的初始化。
   
自定义构造方法的规范:
1.一定是对象方法,一定一“-”开头;
2.返回值一定是id 类型;
3.方法名一般以init 开头。
例如: - (id)initWithName:(NSString *)name
       {
           if(self = [super init])
           {
              _name = name;
            }
            return self;
        }
        
四、分类(Gategory)
定义:可以给一个类扩充一些方法(不修改原来类的代码),不能扩充成员变量。
声明:
@interface 类名(分类名称)
@end
实现:
@implementation 类名(分类名称)
@end

作用:
1.可以给一个类扩充一些方法(不修改原来类的代码),不能扩充成员变量;
2.分类实现中可以访问原来类中声明的成员变量;
3.分类可以重新实现原来类中的方法,但是会覆盖掉原来的方法,会导致原来的方法没有再使用;
4.方法的调用优先级: 分类——>原来类——>父类。

好处:一个庞大的类可以分模块开发;

      一个庞大的类可以由多人来编写,更有利于团队合作。

        
五、练习

比较两个圆是否重叠:
/*
设计一个类Point2D用来表示二维平面中某个点
1.属性
* double x
* double y

2. 方法
* 属性相应的set方法和get方法
* 设计一个对象方法同时设置x和y
* 设计一个对象方法计算跟其他点的距离
* 设计一个类方法计算两个点之间的距离

3. 提示
* C语言中的math.h中有个函数:double pow(double n,double m);计算n的m次方
* C语言的math.h中有个函数:double sqrt(double n);计算根号n的值(对n进行开根)

4. 设计一个圆的类Circle
*/
i#import <Foundation/Foundation.h>
#import <math.h>

//点
@interface Point2D : NSobject
{  
  double _x;  // x值
  double _y; // y值
}
  
//设置x的setter和getter
-(void)setX:(double)x;
- (double)x;

//设置y的setter和getter
- (void)setY:(double)y;
- (double)y;

//同时设置x和y
- (void)setX:(double)x andY:(double)y;

//计算跟其他点的距离
- (double)distanceWithOther:(Point2D *)other;

//计算两个点之间的距离
+ (double)distanceBetweenPoint1:(Point2D *)p1 andPoint2:(Point *)p2;
@end

@implementation Point2D
-(void)setX:(double)x
{
   _x = x;
}
- (double)x
{
   return _x;
}

- (void)setY:(double)y
{
   _y = y;
}
- (double)y
{
   return _y;
}

//同时设置x和y
- (void)setX:(double)x andY:(double)y;
{
/*
  _x = x;
  _y = y;
*/
  [self setX:x];
  [self setY:y];
 }
//计算跟其他点的距离
- (double)distanceWithOther:(Point2D *)other
{
//((x1-x2)的平方+(y1-y2)的平方)开根
  double xDelta = [self x] - [other x];//_x - [other x];
  double yDelta = [self y] - [other y];//_y - [other y];

  double xDeltaPF = pow(xDelta, 2);
  double yDeltaPF = pow(yDelta, 2);

  return sqrt(xDelta + yDelta);
     
}

//计算两个点之间的距离
+ (double)distanceBetweenPoint1:(Point2D *)p1 andPoint2:(Point *)p2
{
   return [p1 distanceWithOther:p2];
}
@end

@interface Circle : NSobject
{
   double _radius; // 半径
   Point *_point; // 圆心(组合)
}

//设置半径的setter和getter
- (void)setRadius:(double)radius;
- (double)radius;

//设置圆心的setter和getter
- (void)setPoint:(Point *)point;
- (void)point;

//判断跟其他圆是否重叠
//返回值是BOOL类型的,方法名一般是以is 开头
- (BOOL)isOverlappingWithOther:(Circle *)other;

+ (BOOL)isOverlappingBetweenCircle1:(Circle *)circle1 andCircle2:(Circle *)circle2;
@end

@implementation Circle
//设置半径的setter和getter
- (void)setRadius:(double)radius
{
    _radius = radius;
}
- (double)radius
{
    return _radius;
}

//设置圆心的setter和getter
- (void)setPoint:(Point *)point
{
  _point = point; 
}

- (Point *)point
{
   return point;
}

//圆心之间的距离> 半径之和则不重叠返回NO
//圆心之间的距离< 半径之和则重叠 返回YES
- (BOOL)isOverlappingWithOther:(Circle *)other
{
    Point *p1 = [self point];
    Point *p2 = [other point];
    double distance = [p1 distanceWithOther:p2;

    double sumRadius = [self radius] - [other radius];

    return distance < sumRadius;
 
}

+ (BOOL)isOverlappingBetweenCircle1:(Circle *)c1 andCircle2:(Circle *)c2
{
            return [c1 isOverlappingWithOther:c2];
@end

int main()
{
/*
  Point *p1 = [Point new];//创建一个新的对象p1
  
  //设置x和y的值
  [p1 setX:10 andY:15]; 

  Point *p2 = [Point new];// 创建一个新的对象p2
  
  //设置x和y的值
  [p2 setX:13 andY:19];

  //计算p1和p2之间的距离
  double d = [p1 distanceWithOther:p2];

  NSLog(@"%d",d);

//调用类方法,计算p1和p2之间的距离
  double d2 = [Point distanceBetweenPoint1:p1 andPoint2:p2];

  NSLog(@"%d",d2); 
 */

//创建一个圆的对象
  Circle *c1 = [Circle new];
   
 // 设置圆的半径
 [c setRadius:3];

 //创建圆心的对象
 Point *p1 = [Point new];

 //设置x和y的值
 [p1 setX:10 andY:15];

 [c1 setPoint:p1];

//设置一个圆的对象c2
 Circle *c2 = [Circle new];
 
 //设置c2的半径
 [c2 setRadius:5];

 Point *p2 = [Point new];

 [p2 setX:13 andY:19];

 [c2 setPoint:p2];

 BOOL b1 = [c1 isOverlappingWithOther:c2];

 NSLog(@"%d"b1);

}

给NSString 分类写个类方法,输出一个字符串中数字的个数:
/*
给NSString添加一个类方法,计算字符串中数字的个数
*/

#import <Foundation/Foundation.h>
//#import <NSString+Number>,多文件开发时.m文件的头文件

@interface NSString(Number)

//方法的声明
+ (int)numberOfString:(NSString *)str;
@end

@implementation NSString(Number)

//方法的实现
+ (int)numberOfString:(NSString *)str
{
int count = 0;
for(int i = 0;i < str.length;i++)
{   
//返回第i个位置的字符
unichar c= [str characterAtIndex:i];

//注意字符串是由字符构成的,单个字符要用''包住
if(c >= '0' && c <= '9')
{
count++;
}
}
return count;
}
@end

int main()

//NSString 类调用方法
int count = [NSString numberOfString:@"wo shi 123 wang"];

//输出数字的个数
NSLog(@"%d",count);
return 0;
}

运行结果:3

给NSString增加一个对象方法,计算当前对象里面的阿拉伯数字的个数:
/*
给NSString 添加一个对象方法,计算当前对象里面的阿拉伯数字的个数
*'/

#import <Foundation/Foundation.h>

@interface NSString 

  //方法的声明
  - (int)numberCount;
@end

@implementation NSString

//方法的实现
  - (int)numberCount
  {
      int count = 0;
  for(int i = 0;i <self.length;i++)
  {
    unichar c = [self characterAtIndex:i];

    if(c >= '0' && c <= '9')
    {
   count++;

    }
      }
  return count;
  }
@end

int main()
{
   NSString *str = @"woshi123wang";
   int count = [str numberCount];
   NSLog(@"%d",count);

   return 0;

}

运行结果:3

          

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  黑马程序员