ios学习之旅---oc面向对象的特点

1.OC简介
Objective-C是一种面向对象的计算机语言,Brad J Cox 1980s 设计了Objective-C,
 该语言是基于SmallTalk-80。1988 NeXT 发布了Objective-C,它的开发环境和类库叫
“NEXTSTEP”,1994年NeXT与Sun发布了标准的NEXTSTEP系统,取 名“OPENSTEP”,
 软件自由基金会OPENSTEP版本叫GNUStep。
  1996 苹果公司开始支持NeXT,把NEXTSTEP/OPENSTEP用于 Mac OS X操作系统开发,
它的版本和开发环境叫Cocoa,使用 Objective-C作为基础语言,开发工具Xcode和Interface Builder。
2007 苹果公司推出Objective-C 2.0,Objective-C是Mac OS X和 iOS开发的基础语言
特点:
   OC不是一门全新的语言
   C语言的基础上增加了一层最小的面向对象语法 
   OC完全兼容C语言语言
   可以在OC代码中混入C语言代码,甚至是C++代码
   可以使用OC开发Mac OS X平台和iOS平台的应用程序
2.设计类
 类名:Zombies
 属性:life,颜色,位置,形状
 行为:走,咬,死,loseLife
 
 炮弹
 类名:Cannonball
 属性:大小,威力,飞行距离,速度
 行为:飞,爆炸
 
 车
 类名:Car
 属性:载员,速度,牌照
 行为:跑,停
 
 学生
 类名:Student
 属性:姓名、学号,性别
 行为:学习,逃学
 
 手机:
 类名:Phone
 属性:大小,尺寸,颜色,_cup,内存
 行为:打电话,发短信

3.NSString类的简介

#import 
#import 

int main(int argc, const char * argv[]) {   
//  NSString 对象的创建    
// 1、通过字面量创建
    NSString *str  =  @"天气冷了,注意身体!";
    NSLog(@"%@",str);
// 2、通过对象方法
//    NSString *str1  = [NSString new];
    NSString *str1 = [NSString alloc];
//    str1 = [str1 init];
     str1 = [str1 initWithUTF8String:"大家要努力学习啊!"];
    NSLog(@"%@",str1);
// 3、通过类方法创建对象
//    类方法它是隶属于类的,它是通过“类名”调用
//    此处的格式化字符串与NSLog中的格式化字符串是一样的
    NSString *str2 = [NSString stringWithFormat:@"今天股票有跌%d个点!", 10];
    NSLog(@"%@",str2);   
// 4、NSString 对象中表示长度函数
//   command + 鼠标左键点击进去
//  length 计算的是字符串中有几个字符
    long len  = [str length];
    NSLog(@"%ld",len);    
    char *strc = "天气冷了,注意身体!";
//  strlen计算字符串所占用的字节数,在UTF8编码中一个中文占用3个字节
    len  =  strlen(strc);
    NSLog(@"%ld",len);      
    len = [@"abc你好" length];
    NSLog(@"%ld",len);
   
    return 0;
}
4.BOOL类型
  BOOL OC提供的一种Boolean类型,就是用来表示逻辑上真与假这个类型 
  BOOL 在OC中有两个取值  YES 和 NO
  YES 真 对应数字 1
  NO  假 对应数字 0 
  使用BOOL可以提高代码可读性,减少代码的出错率
  所有数据类型都可以定义变量
  所有的数据类型都可以作为形参或实参
  所有数据类型类都可以作为返回值

#import 
void testBool(BOOL flag)
{
    if (flag) {
        NSLog(@"真");
    }else{
        NSLog(@"假");
    }
}

@interface CZLogin : NSObject

- (BOOL) vilidateUserName:(NSString *)userName andPassword:(NSString *) password;

@end

@implementation CZLogin

- (BOOL)vilidateUserName:(NSString *)userName andPassword:(NSString *)password
{
//  当对象进行==比较时候,比较是它们所指向的是不是同一个地址
//  验证用户名不能为空
//  nil 空对象
    if (userName == nil || [userName isEqualTo:@""]) {        
        NSLog(@"用户名不能为空");
        return NO;
    }    
    if (password == nil || [password isEqualTo:@""]) {
        NSLog(@"密码不能为空");
        return NO;
    }    
    if ([userName isEqualTo:@"大木"] && [password isEqualTo:@"123"]) {
        return YES;
    }    
    return NO;
}
@end


int main(int argc, const char * argv[]) {
      
   CZLogin *login =  [CZLogin new];    
   BOOL canLogin  =  [login vilidateUserName:@"大木" andPassword:@""];
    if (canLogin) {
        NSLog(@"可以登录!");
    }else{
        NSLog(@"登录失败!");
    }    
    BOOL isTrue = YES;
    testBool(YES);
    testBool(NO);
    
    
//  找出10~100中可以被7整除的最小的数    
//    for(int i = 10;i < 100;i++)
//    {
//        BOOL isDivisible = (i % 7 == 0);
//        if (isDivisible) {
//            NSLog(@"%d",i);
//            break;
//        }
//    }   
    return 0;
}
5.对象与方法
   1、对象做方法参数传递是地址传递
   2、对象可以在方法中进行连续的传递
   3、对象可以作为方法的返回值

#import 
/*
  定义狗类
  类名 CZDog
  属性 _name
  行为 biteOtherDog
 */
@interface CZDog : NSObject
{
@public
    NSString *_name;
}
- (void) biteOtherDog:(CZDog *) other;
@end


@implementation CZDog
- (void) biteOtherDog:(CZDog *) other
{
    NSLog(@"%@ 咬了 %@ 一口",_name,other->_name);
}

@end
/*
   Person类
   changeDog
   orderDog: biteOtherDog:
 
 */
@interface CZPerson : NSObject

//用于改变狗名字
- (void) changeDog:(CZDog *) dog;
/**
 *  指使一个狗去咬另外一个狗
 *
 *  @param dog   去咬的那个狗
 *  @param other 被咬那只狗
 */
- (void) orderDog:(CZDog *) dog biteOtherDog:(CZDog *) other;
@end


@implementation CZPerson

//对象作为方法参数
- (CZDog *) sellDog
{
    return [CZDog new];
}

//用于改变狗名字
- (void) changeDog:(CZDog *) dog
{
    dog->_name = @"大黄";
}
/**
 *  指使一个狗去咬另外一个狗
 *
 *  @param dog   去咬的那个狗
 *  @param other 被咬那只狗 
 */
- (void) orderDog:(CZDog *) dog biteOtherDog:(CZDog *) other
{
//   让去这只狗去咬另外一只狗
    [dog biteOtherDog:other];
}
@end

int main(int argc, const char * argv[]) {
  
    
    CZDog *dog = [CZDog new];
    dog->_name = @"旺财";        
    CZDog *other = [CZDog new];
    other->_name = @"小黑";    
    CZPerson *person = [CZPerson new];
    [person changeDog:dog];
    
    NSLog(@"%@",dog->_name);
//  对象作为方法参数的连续传递
    [person orderDog:dog biteOtherDog:other];   
    CZDog *newDog  =  [person sellDog];   
    newDog->_name = @"小狗!";   
    NSLog(@"%@",newDog->_name);
    
    return 0;
}
ios学习之旅---oc面向对象的特点_第1张图片

6.封装:
  1、类是数据与功能的封装,数据就是成员变量,功能就类方法或对象方法
  2、对数据的封装
     如果我们把属性设置为@public那么,这个属性外部就可以任意的修改,我们就失去管理这个属性的权利
     1、当你把属性暴露在外部的时候,那么你就是失去对它的管理,一旦这个属性被多个人用的时候,如果再像管理这个属性就变得非常麻烦,这个类的可维护性就变得很差
     
     2、怎么对数据进行封装
        1、为每一个属性提供getter 和 setter方法
        2、setter方法:又称为写方法,赋值给对象赋值
           1、必须是对象方法
           2、它没有返回值
           3、名字 set + 属性名称去掉下划线,首字母大写
           4、必须提供一个参数,参数类型必须与所对象的成员变量的类型一致
        3、getter方法:又称为读方法,赋值读取属性的值
           1、必须是对象方法
           2、必须要返回值,并且返回值类型要与成员变量类型一致
           3、方法名必须是成员变量去掉下划线
           4、一定是空参的
  3在对象方法中访问成员变量的时候,其中隐藏一个指针
   当方法中如果没有与成员变量名称相同变量,编译器在编译会自动给它加上一个self指针
   如果有与成员变量同名的局部变量,那么这个名字就是一个局部变量,编译器就不会再给他加上self指针了

#import 
#import "CZCat.h"
/**
 设计车类,提供getter和setter方法
 1> 车
 (1)属性
 * 轮子数
 * 速度
 (2)方法
 * 属性相应的setter和getter方法
 */

@interface CZCar : NSObject
{
    int _wheels;//车轮数‘
    double _speed;//速度
}
//_wheels setter
- (void) setWheels:(int) wheels;
- (int) wheels;
- (void) setSpeed:(double) speed;
- (double) speed;

@end

@implementation CZCar
//_wheels setter
- (void) setWheels:(int) wheels
{
    _wheels = wheels;
}

- (int) wheels
{
    return _wheels;
}

- (void) setSpeed:(double) speed
{
    _speed = speed;
}
- (double) speed
{
    return _speed;
}

@end

int main(int argc, const char * argv[]) {
  
    CZCat *cat =  [CZCat new];
    [cat setAge:100];   
    [cat setName:@"小黑"];   
    NSLog(@"age = %d,name = %@",[cat age],[cat name]);    
    
    return 0;
}





你可能感兴趣的:(ios,ios,编程,面向对象,设计,objective-c)