OC语法基本使用

首先来了解一下:

1.面向过程与面向对象

1.1面向过程编程

    什么是面向过程?

Procedure,流程;

主干流程和分支流程;

子模块,代码的复用;

特点:所有的工作,一个人干,不利于工程协作;

1.2 类和对象

 1.2.1 从生活逻辑

┏    ┓         ┏  对象   ┓

  人           ┃ 乔布斯          库克    

  电脑         ┃ 你桌子上那台    我桌子上这台

 

类class(不占用内存) 一个类的实例 instance(占内存)    

1.2.2从封装角度

结构体:自定义的数据类型,封装成员变量,属性

函数:模块,封装子过程,方法

类:属性和方法的结合,同时封装了属性和方法(行为)

1.2.3从语言角度

  类:类型

  对象:变量,可读可写容器;常量,只读不写的容器;

1.2.4 从官方定义

 类:一种数据抽象

 对象:一种数据具象

 

2.OC语言与C语言的联系

2.1文件后缀名 

c语言

oc 语言:*.m

2.2#import的作用

相当于#include,但比#include 更加智能,能避免头文件重复包含

-》 NSLog函数和printf函数的区别

自动换行

有时间戳前缀 

2.3OC的字符串和 C 语言字符串的区别

@符号开始的字符串是 OC 的;

无@符号前缀的则为 C 的;

OC 字符串的代表符号是%@;

C 字符串的代表符号底%s;

OC字符串是一个对象;空间在堆区

C 语言字符串只是数据;空间在栈区

 

eg.oc语言简单使用(输出语句)

  //相当于#include,但比其更加智能,避免头文件的重复包含
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    //oc语言的关键词以@符号开头,@符号读作at for
  @autoreleasepool {
    NSString* myName = @"hello!";
    //NSLog的输出,在程序的后台,对应于前台,在 iOS 中 UI界面是前台,Command Line Interface是后台
      NSLog(@"Hello, World!");
    NSLog(@"Hello, %@,%@.",myName,@"张三");
    NSLog(@"Hello, %s.","hello");
    
  }
    return 0;
}

 eg.oc语言创建一个类(方式一)

#import <Foundation/Foundation.h>
  //类的声明
@interface Person : NSObject{
    NSString* nsName;
    //char* name;
    int age;
}
  //'-'号开始的方法是实例方法;
  //'+'号开始的方法是类方法
- (void)setAge:(int)_age;

@end


  //类的实现
@implementation Person

- (void)setAge:(int)_age
{
  age = _age;
}

@end


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

  @autoreleasepool {
      //类的使用
    Person* person = [[Person alloc] init];
    [person setAge:20];

  }
    return 0;
}

 eg.oc语言创建一个类(方式二)

(1)头文件Person.h

 //类的声明文件,类的接口文件
#import <Foundation/Foundation.h>

@interface Person : NSObject {
   //@public//公开的,访问权限最大//所有的对象都能访问该属性
  //类的属性//要用大括号括起来
  int _number;//保存学号信息
  //@protected//保护的,访问权限中庸//只有自己和子类能访问该属性
  NSString* _name;//下划线开始的变量名作为类的属性变量,和形式参数相区别,这是工程习惯,代表该变量是对象内部的空间
  //@private//私有的,访问权限最小//只有自己能访问该属性
  int _age;
}
  //中缀函数名方式
  //id 相当于void* 
  //id是泛型的对象指针类型
- (id)initWithNumber:(int)aNumber
             andName:(NSString*)aName
              andAge:(int)aAge;

  //类的方法//不能用大括号
- (void)setNumber:(int)aNumber;
- (int)number;

- (void)setAge:(int)aAge;
- (int)age;

- (void)setName:(NSString*)aName;
- (NSString*)name;

@end

 (2)实现文件Person.m

//需要包含头文件
#import "Person.h"

@implementation Person

- (id)initWithNumber:(int)aNumber
             andName:(NSString*)aName
              andAge:(int)aAge
{
    //super代表父类
    //父类在帮对象初始化共同的继承的变量
  if (self = [super init]) {//nil表示空对象
    //对象初始化自己特殊的变量
    _number = aNumber;
    _name = aName;
    _age = aAge;
  }

  //self是一个指向对象自己的对象指针,该指针由 NSObject 提供
  return  self;
}
  //对象的自描述方法,也是一个由 NSObject 遗传的隐式方法,
  //我们可以按照自己的意愿,重写该方法(也即覆盖父类方法)
- (NSString *)description{
  return [NSString stringWithFormat:@"学号:%d,姓名:%@,年龄:%d",_number,_name,_age];
}


- (void)setNumber:(int)aNumber{
    //工程健壮性规范,加快运行时的效率
//  if (_number != aNumber) {
//     _number = aNumber;
//  }
//对于非对象属性,检查可选
    _number = aNumber;
}

- (int)number{

  return _number;
}


- (void)setName:(NSString*)aName{
    //针对对象类型的属性,在设置值之前,必须检查是否为同一对象(指针)
  if(_name != aName){
    _name = aName;
  }
}

- (NSString*)name{

  return _name;
}


//setter方法,用于写入对象内部的属性数据
- (void)setAge:(int)aAge{
    //设置对象内部的属性值
  _age = aAge;
}
//getter方法,用于读取对象内部的属性数据
- (int)age{
    //返回对象内部的属性值
  return _age;
}
@end

 (3)main.m文件

#import <Foundation/Foundation.h>
 //导入类的头文件
#import "Person.h"

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

  @autoreleasepool {
      //用类作为模板来创建对象
      //对象的数据类型是指针类型,并且它是指向堆空间的指针类型
      //OC中,所有对象,都用指针来引用
    Person * xiaoLi = [[Person alloc] initWithNumber:20 andName:@"小李" andAge:28];
      //NSLog(@"xiaoLi对象的自描述信息为:%@",[xiaoLi description]);
      NSLog(@"xiaoLi对象的自描述信息为:%@",xiaoLi);
      //写入 xiaoLi的属性信息
      //在 OC中必须通过方法,对对象属性进行操作,以便保护对象的封装性
      //[xiaoLi setName:@"小李"];
      //方法调用,又称为发送消息,对象接受消息
     //    [xiaoLi setAge:28];
     //    [xiaoLi setNumber:13];
     //[xiaoLi initWithNumber:20 andName:@"小李" andAge:18];
    NSLog(@"xiaoLi name:%@",[xiaoLi name]);
    NSLog(@"xiaoLi age:%d",[xiaoLi age]);
    NSLog(@"xiaoLi number:%d",[xiaoLi number]);
    Person* p=[[Person alloc] init];
    [p setNumber:22];
    [p setName:@"哈哈"];
    [p setAge:24];
    
    NSLog(@"姓名:%@ 学号:%d 年龄:%d",[p name],[p number],[p age]);
    
  }
    return 0;
}

 

posted @ 2014-12-13 20:15  sublimter随想博客  阅读(212)  评论(0编辑  收藏  举报