语法基础——Objective-C语法基础

2023-11-05

前言

学习过Swift之后,好久没用已经生疏了,现在有项目来了,不得不停下手下的工作,开始学习OC,当然这篇文章会以Java基础和C基础作为支撑,这样学习起来入门很简单,可能这篇文章有点个人主义,用作个人笔记吧

OC特点

  • 支持C语法
  • 支持面向对象特性
  • 兼容性好,可以同时在项目中使用OC、C++,也可以引入C、C++库文件
  • OC中没有命名空间机制,也没有包的概念,为了区分不同的类,在类名加前缀
  • OC中关键字表示都以@开头,用于区分C和C++的关键字,字符串也以@开头,如@public、@protected、@private、@”Hello World”

文件名后缀

语言 头文件后缀 主文件后缀
c .h .c
c++ .h .cpp
oc .h .m
oc与c++ .h .mm

OC基本数据类型

基本数据类型:数值型(整型、浮点型),字符型(char)、布尔型(BOOL)、空类型(Void)、Block类型、指针数据类型(class、id类型)、特殊类型(SEL、nil)

1、instancetype和id类型

  1. instancetype可以作为返回类型,可以返回和方法所在类相同类型的对象,只能作为返回值
  2. id可以作为返回类型,返回任意类型的objcetive-c的对象类型,既可以作为返回值也可以作为参数

类与属性

1、 类的声明语法

@interface Person : NSObject{
    属性声明
}
    方法声明
@end

特点:

  1. @interface:相当于Java中的class
  2. 类名后面的冒号:相当于Java中的extends

2、类的实现语法

@implementation XYZPerson
    方法实现{

    }
@end

3、完整例子

4、创建对象

//第一种创建方式:创建一个可用的对象
Person *p=[Person new];
//new方法的内部会分别调用两个方法来完成2件事情
//1、使用alloc方法来分配存储空间(返回分配的对象)
//2、使用init方法来对对象进行初始化

//1、调用类方法+alloc分配存储空间,返回未经初始化的对象
Person *p1=[person  alloc];
//2、调用对象方法-init进行初始化,返回对象本身
Person *p2=[p1 init];
//第二种创建方式:以上2步简化为
Person *p=[[Person alloc] init];

//默认初始化完毕后,所有成员变量的值都为0
//用完对象要释放内存
[lisi release];

究竟new方式和alloc/init方式有什么区别?

  1. new和alloc/init在功能上是一致的,分配内存并完成初始化
  2. 采用new方式只能采用默认的init方法完成初始化
  3. 采用alloc的方式可以用自定义的构造方法完成初始化

5、访问对象属性

//调用类的属性,语法:对象->属性名
lisi->age;
lisi->name;
//或者:(*对象名).对象属性
(*lisi).name

6、调用方法

//调用无参方法,语法:[对象名 方法名]
[Person eat]
[Person run]
//调用有参方法,语法:[对象名 方法名:参数]
[Person eat:@"吃虾"]
[Person run:5]

7、@property和@synthesize

在头文件中声明属性

//编译器会自动补出其setget方法
@property int age;

在m文件中实现

//编译器会自动生成setget方法的实现,默认已经自动@synthesize属性的值
@synthesize age;

构造方法

1、默认的构造方法

- (instancetype)init{
    if(slef = [super init]){
        //初始化
    }
    return self;
}

2、自定义构造方法

一般构造方法都以init开头,这样并不是复写系统默认的构造方法,而是再添加一个构造方法

- (instancetype)initWithDict:(NSDictionary *)dict{
    if(slef = [super init]){
        //初始化并赋值
        self.name = dict[@"name"];
    }
    return self;
}

函数

1、减号表示对象方法,语法:-(返回值类型)方法名:(参数类型)参数名

@interface Person : NSObject
-(Void) someMethod;
-(Void) someMethodWithValue:(someType)Value;
@end

特点:

  1. 函数的返回类型和参数类型必须用括号
  2. 函数的形参用冒号表示

2、加号表示静态方法(类方法),语法:+(返回值类型)方法名:(参数类型)参数名

@interface NSString: NSObject
+(id) string;
+(id) stringWithString:(NSString *)astring;
+(id) stringWithFormat:(NSString *)format,...;
@end

区别:

  1. 对象方法可以直接访问属性,静态方法不能访问属性
  2. 静态方法可用类名直接调用方法,而对象方法不行

点语法

声明对象并提供get和set方法

#import <Foundation/Foundation.h>

@interface Person : NSObject{
   int _age;
}
- (void)setAge:(int)age;
- (int)age;

@end

实现对象

#import "Person.h"

@implementation Person

- (void)setAge:(int)age{   //set方法
    _age = age;
}
- (int)age{   //get方法
   return _age;
}

@end

点语法的使用

#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[]){
    @autoreleasepool {    
        Person *person = [[Person alloc] init];

        person.age = 10;//点语法,等效与[person setAge:10];
        //这里并不是给person的属性赋值,而是调用person的setAge方法

        int age = person.age;//等效与int age = [person age];
        //这里调用person的set方法

        NSLog(@"age is %i", age);
        [person release];        
    }
    return 0;
}

为什么有些使用_age,有些语法使用self.age?

属性值:_age
点语法:self.age

  1. 下划线是一种编程规范,_age是直接拿到age这个属性,不通过getAge方法获取,建议在init里面使用_age
  2. self.age相当于调用[self getAge],系统自动生成的代码(_age = age),其实也是_age,如果你重写了getAge方法,返回的值就不一样了

静态变量

1、OC与Java或C的区别

  1. OC中的静态变量:它是私有的全局变量,不能直接通过类名访问,它只作用于它声明所在的.m文件中
  2. C或者Java中的静态变量:可以直接通过类名拿到这个变量,在其他类中可以进行修改

2、静态变量全局化

不是说OC中静态变量不能使用在其他类中,可以通过静态方法向外提供该静态变量

在h文件中定义静态变量和向外提供静态变量的方法

#import <UIKit/UIKit.h>
//静态变量
static int selectIndex;

@interface TBC_SendPassword : UITabBarController
//提供静态变量
+(int)getSelectIndex;
@end

在m文件中覆写该方法,提供静态变量,你可以在m文件中修改对应的selectIndex的值

+(int)getSelectIndex{
    return selectIndex;
}

在其他类中需要使用该类的静态变量,首先在h文件中导入头文件

#import "TBC_SendPassword.h"

在m文件中直接通过静态的方法的使用,获取对应的值

if([TBC_SendPassword getSelectIndex] != 0){
    return;
}

Hello World

相当于Java的main方法

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]){
    @autoreleasepool{
        NSLog(@"Hello World");
    }
    return 0;
}

特点:

  1. Foundation.h是Foundation框架中的头文件,是OC一个基础类库,基本所有OC代码都要引入这个类库
  2. @autoreleasepool是OC的关键字,作用是对在关键字后面的程序自动进行内存回收

import指令

  • #include指令:单独使用会造成导入重复库文件,从而引起报错
  • #import指令:#include增强版,有效处理重复导入问题,不会报错

特点:

  1. 导入系统类库用<>,导入自定义类库用””
  2. BOOL类型,包含两个值YES和NO,其实布尔类型就是整数1和0

NSLog

//定义一个字符串,str存放是内存地址
NSString *str = "你好";
NSLog(@"str的地址=%p,str的值=%@",str,str);
//打印OC字符串要用@""
NSLog(@"Hello OC");
//用C语言打印字符串
printf("Hello OC");

注意不能用C语言打印OC字符串,也不能用OC语言打印C字符串

NSString

//创建字符串
NSString * str = @"Hello";
//字符串长度,OC中英文都占1个字节
[str length]
//创建字符串对象
NSString * str1 = [NSString new]
//复制字符串
NSString * str2 = [[NSString malloc]initWithString:str];
//格式化字符串
NSString * str3 = [NSString  stringWithFormat:@"图片 xx %02d- %02d",1,9];
//字符串拼接
NSString *newString = [NSString stringWithFormat:@"%@%@",str1,str2];

NSMutableArray

NSMutableArray是长度可变数组,也就是说当数组前面的元素被删除后,后面的元素会往前移,而NSArray是长度不可变数组

//创建NSMutableArray
NSMutableArray *mArray = [NSMutableArray array]; 
//添加元素
[mArray addObject:@"name"];
//移除元素
[mArray removeObject:@"name"];
//移除所有元素
[mArray removeAllObjects];
//取出元素
mArray[2];

强制类型转换

//字符转int
int intString = [newString intValue];
//int转字符
NSString *stringInt = [NSString stringWithFormat:@"%d",intString];
//字符转float
float floatString = [newString floatValue];
//float转字符
NSString *stringFloat = [NSString stringWithFormat:@"%f",intString];

NSBundle

NSBundle是一个目录,其中包含了程序会使用到的资源,相当于项目中的主目录文件夹,NSBundle用得最多的是获取Plist文件,并获取Plist的内容,Plist文件可以简单理解为小数据库类型的文件,它在项目初始化时默认会创建一个info.plist文件,里面会存储系统的默认配置信息

//打印沙盒路径
NSLog(NSHomeDirectory());
//创建NSBundle
NSBundle *bundle = [NSBundle mainBundle];
//获取NSBundle里myPic.png文件的路径的两种方法
NSString *path = [mainBundle pathForResource:@"myPic" ofType:@".png"];
NSString *path = [mainBundle pathForResource:@"myPic.png" ofType:nil];
//获取NSBundle里的Plist文件
NSString *plistPath = [mainBundle pathForResource:@"myList.plist" ofType:nil];
//通过Plist路径获取字典
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:plistPath];
//通过Plist路径获取数组
NSArray *array = [NSArray arrayWithContentsOfFile:plistPath];

kvc

OC中的KVC操作就和Java中使用反射机制去访问类中private权限的变量一样

1、kvc与对象

1.单个对象赋值:通过kvc的方式,可以省去自动解包和装包操作

//通过kvc方式设置属性
Person *p = [[Person alloc] init];
[p setValue:@"jiangwei" forKey:@"name"];
[p setValue:@22 forKey:@"age"];
//通过kvc方式读取属性
NSString *name = [p valueForKey:@"name"];        

2.单个对象对对象赋值:对象中包含另一个对象

Book *book = [[Book alloc] init];
Author *author = [[Author alloc] init];   
//通过kvc方式设置对象
[book setValue:author forKey:@"author"];

3.单个对象对数组赋值:对象中存在数组属性,数组装的是另一个对象

//author中的issueBook字段是个NSArray
//通过kvc方式获取数组的大小,语法:NSArray.@count
NSNumber *count = [author valueForKeyPath:@"issueBook.@count"];
//通过kvc方式获取书籍价格的总和,语法:NSArray.@sum+字段名
NSNumber *sum = [author valueForKeyPath:@"issueBook.@sum.price"];
//通过kvc方式获取书籍的平均值,语法:NSArray.@avg+字段名
NSNumber *avg = [author valueForKeyPath:@"issueBook.@avg.price"];
//通过kvc方式获取书籍的价格最大值和最小值,语法:NSArray.@max+字段名
NSNumber *max = [author valueForKeyPath:@"issueBook.@max.price"];
NSNumber *min = [author valueForKeyPath:@"issueBook.@min.price"];

2、kvc与字典

1.通过获取字典字段,将字典转换为属性

self.name = dict[@"name"];
self.icon = dict[@"icon"];

2.通过kvc方式进行赋值,自动将字段与属性匹配,前提是字段名和字典名必须相同

[self setValuesForKeysWithDictionary:dict];

日期格式化

//取出当前时间 
NSDate *currentDate = [NSDate date];
//设置时间格式
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
//时间的格式
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
//获取时间的字符串
NSString *date = [formatter stringFromDate:currentDate];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

语法基础——Objective-C语法基础 的相关文章

随机推荐

  • QT qDebug打印

    QT 命令行窗口16进制显示 QString Str qDebug lt lt Str sprintf result d 0x 02x n j tmp qDebug 16进制显示可以使用0x 02x
  • PyCharm中无法调包,报错ModuleNotFoundError: No module named ‘numpy‘

    PyCharm中无法调用numpy 报错ModuleNotFoundError No module named numpy 之后将解释器修改为 重新运行 成功
  • 超级黑科技代码!Python打造电脑人脸屏幕解锁神器附带接头暗号

    前言 让我的电脑认识我 我的电脑只有认识我 才配称之为我的电脑 今天 我们用Python实现高大上的人脸识别技术 Python里 简单的人脸识别有很多种方法可以实现 依赖于python胶水语言的特性 我们通过调用包可以快速准确的达成这一目的
  • Docker学习(四)——docker portainer可视化面板

    Docker学习 四 docker portainer可视化面板 1 什么是portainer 2 下载镜像 可省略 3 运行portainer容器 4 根据映射的主机端口 通过localhost 9000进行访问 4 1 设置密码 4 2
  • Kettle的下载安装教程和使用简介(内含第一个kettle转换案例)

    本文首先介绍Kettle工具的安装及基本概念 然后通过一个案例实操介绍Kettle工具的使用 本文重要的内容如下 Kettle的安装 1 Java的安装 登录Java的官网后 进入到下载页面 http www oracle com tech
  • 设置JVM选项-ElasticSearch

    设置JVM的方法 在ElasticSearch中设置JVM选项有两种方法 一种是通过jvm options 另一种是通过环境变量ES JAVA OPTS jvm options jvm options是优选选择的方法 通过tar或者zip安
  • 函数式和面向对象编程有什么区别?

    函数式编程 Functional Programming 和 面向对象编程 Object Oriented Programming 是两个主流的编程范式 他们有各自独特的闪光点 比如函数式编程的数据不可变 惰性求值 面向对象编程的继承 多态
  • python 数据类型及转换

    常见的数据类型 使用 type 内置类可以查看变量所对应的类型 int 整数 十进制 二进制 使用0b开始表示 八进制 使用 0o 开始 十六进制 使用 0x 开始 float 浮点数 complex 复数 str 字符串 就是一段普通的文
  • 竞赛题-6258. 数组中最长的方波

    题目 给你一个整数数组 nums 如果 nums 的子序列满足下述条件 则认为该子序列是一个 方波 子序列的长度至少为 2 并且 将子序列从小到大排序 之后 除第一个元素外 每个元素都是前一个元素的 平方 返回 nums 中 最长方波 的长
  • gcc -Wall详解

    当GCC在编译过程中检查出错误的话 它就会中止编译 但检测到警告时却能继续编译生成可执行程序 因为警告只是针对程序结构的诊断信息 它不能说明程序一定有错误 而是存在风险 或者可能存在错误 虽然GCC提供了非常丰富的警告 但前提是你已经启用了
  • j2ee_XML建模

    1 什么叫XML建模 将XML配置文件中的元素 属性 文本信息转换成对象的过程叫做XML建模 XML建模 1 根据XML配置文件元素节点创建元素节点实体类 ConfigModel ActionModel ForwardModel 2 利用d
  • ifconfig、ip addr、ip route用法总结

    最近使用haproxy keepalived 负载均衡 发现虚拟IP有问题 配置文件里配的VIP是 4 143 但是执行 ip a 发现还有一个虚拟IP 4 134 应该是以前配置文件keepalived conf里设置过VIP 4 134
  • 做大模型时代的应用层创业!

    Datawhale创业 方向 大模型 合作伙伴 Datawhale 亲爱的科技探险家们和代码魔法师们 未来的钟声已经敲响 预示着一场极度炫酷的虚拟现实游戏即将展开 从初期简单的智能识别 到设计师级别的图纸设计 生成式AI技术 Generat
  • python写路径时候的问题————转载ningqingzy的文章

    作为笔记总结学习 如有侵权 立马删除 总结有三种方法 更换为绝对路径的写法 func1 C Users renyc 显式声明字符串不用转义 加r func1 r C Users renyc 使用Linux的路径 func1 C Users
  • 数仓 - hive ,身份证和手机号 匹配 - 正则方式

    数仓 hive 身份证和手机号 匹配 正则方式 身份证 内容校验 身份证号字段 regexp 1 9 0 9 14 1 9 0 9 16 0 9xX 长度校验 and length trim 身份证号字段 15 or length trim
  • MyBatis特殊SQL的执行(模糊查询、批量删除、动态设置表名、添加功能获取自增的主键)

    一 模糊查询 1 1 like xxx 的方式模糊查询 根据用户名进行模糊查询 param username return java util List
  • activiti 6.x 多实例加签(如有不足留言指出)

    最近刚接触activiti 用的6 x 网上资料太少 断点追流程看属性写了个加签的操作 目前测试的没啥问题 如有问题 请留言指教 上代码 完事之后三个表查查有没有新增数据 有就成了 多实例的才能复制 调用之前最好先判断下 protected
  • 7个程序员常用的接单平台推荐

    推荐7个程序员常用的接单平台 不管做兼职 副业 还是全职自由职业 都可能会用到下面几个网站 特别推荐第一个 飞援 地址链接 前端开发外包 小程序开发兼职 程序员兼职平台 飞援 程序员远程灵活用工平台 聚集了高质量的兼职和全职自由职业开发者
  • sklearn学习笔记

    1 波士顿房价线性回归模型 from sklearn import datasets from sklearn linear model import LinearRegression boston datasets load boston
  • 语法基础——Objective-C语法基础

    前言 学习过Swift之后 好久没用已经生疏了 现在有项目来了 不得不停下手下的工作 开始学习OC 当然这篇文章会以Java基础和C基础作为支撑 这样学习起来入门很简单 可能这篇文章有点个人主义 用作个人笔记吧 OC特点 支持C语法 支持面