博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OC语法基本使用
阅读量:5094 次
发布时间:2019-06-13

本文共 4060 字,大约阅读时间需要 13 分钟。

首先来了解一下:

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 
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 
//类的声明@interface Person : NSObject{ NSString* nsName; //char* name; int age;} //'-'号开始的方法是实例方法; //'+'号开始的方法是类方法- (void)setAge:(int)_age;@end //类的实现@implementation Person- (void)setAge:(int)_age{ age = _age;}@endint main(int argc, const char * argv[]){ @autoreleasepool { //类的使用 Person* person = [[Person alloc] init]; [person setAge:20]; } return 0;}

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

(1)头文件Person.h

//类的声明文件,类的接口文件#import 
@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 
//导入类的头文件#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;}

 

转载于:https://www.cnblogs.com/sublimter/p/4161790.html

你可能感兴趣的文章
Dirichlet分布深入理解
查看>>
Javascript的调试利器:Firebug使用详解
查看>>
(转)Android之发送短信的两种方式
查看>>
使用vue脚手架搭建项目
查看>>
Java基础之ArrayList与LinkedList、Vector,以及HashMap与HashTable的区别
查看>>
网络爬虫初步:从一个入口链接开始不断抓取页面中的网址并入库
查看>>
iOS archive(归档)的总结 (序列化和反序列化,持久化到文件)
查看>>
python第九天课程:遇到了金角大王
查看>>
字符串处理
查看>>
ECharts(Enterprise Charts 商业产品图表库)初识
查看>>
LeetCode Factorial Trailing Zeroes (阶乘后缀零)
查看>>
hdu 5402 Travelling Salesman Problem (技巧,未写完)
查看>>
[AIR] 获取U盘,打开U盘
查看>>
HtmlUnitDriver 网页内容动态抓取
查看>>
django url 路由设置技巧
查看>>
三言两语说清“线性流程”
查看>>
(转)虚函数和纯虚函数区别
查看>>
ad logon hour
查看>>
获得进程可执行文件的路径: GetModuleFileNameEx, GetProcessImageFileName, QueryFullProcessImageName...
查看>>
证件照(1寸2寸)拍摄处理知识汇总
查看>>