热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ObjectiveC:语法基础

OC特点:    1)支持C语法;    2)支持面向对象特性;    3)兼容性好,可以同时在项目中使用OC、C++,也可以引入C、C++库文件;    

OC特点:

    1)支持C语法;

    2)支持面向对象特性;

    3)兼容性好,可以同时在项目中使用OC、C++,也可以引入C、C++库文件;

    4)OC中没有命名空间机制,也没有包的概念,为了区分不同的类,在类名加前缀;

    5)OC中关键字表示都以@开头,用于区分C和C++的关键字,字符串也以@开头,如@public、@protected、@private、@”Hello World”;

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  Person 方法实现{

    }

@end

3、完整例子

Person.h 文件

@interface Person : NSObject{

    属性声明

}

-(void)eat;

@end

MPerson.m 文件

@implementation Person 

-(void)eat{

    //执行吃的动作

   }

@end

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

在头文件中声明属性

//编译器会自动补出其set和get方法

@property int age;

在m文件中实现

//编译器会自动生成set和get方法的实现,默认已经自动@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

@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

#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

//静态变量

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

#import  

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

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

//定义一个字符串,str存放是内存地址

NSString *str = &#8220;你好&#8221;;

NSLog(@&#8221;str的地址=%p,str的值=%@&#8221;,str,str);

//打印OC字符串要用

@&#8221;&#8221;NSLog(@&#8221;Hello OC&#8221;);

//用C语言打印字符串

printf(&#8220;Hello OC&#8221;);

NSString

//创建字符串

NSString * str = @&#8221;Hello&#8221;;

//字符串长度,OC中英文都占1个字节

[str length]

//创建字符串对象

NSString * str1 = [NSString new]

//复制字符串

NSString * str2 = [[NSString malloc]initWithString:str];

//格式化字符串

NSString * str3 = [NSString stringWithFormat:@&#8221;图片 xx %02d- %02d&#8221;,1,9];

//字符串拼接

NSString *newString = [NSString stringWithFormat:@&#8221;%@%@&#8221;,str1,str2];

NSMutableArray

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

//创建

NSMutableArrayNSMutableArray *mArray = [NSMutableArray array];

//添加元素

[mArray addObject:@&#8221;name&#8221;];

//移除元素

[mArray removeObject:@&#8221;name&#8221;];

//移除所有元素

[mArray removeAllObjects];

//取出元素

mArray[2];

强制类型转换

//字符转

intint intString = [newString intValue];

//int转字符

NSString *stringInt = [NSString stringWithFormat:@&#8221;%d&#8221;,intString];

//字符转

floatfloat floatString = [newString floatValue];

//float转字符

NSString *stringFloat = [NSString stringWithFormat:@&#8221;%f&#8221;,intString];

NSBundle

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

//打印沙盒路径

NSLog(NSHomeDirectory());

//创建

NSBundleNSBundle *bundle = [NSBundle mainBundle];

//获取NSBundle里myPic.png文件的路径的两种方法

NSString *path = [mainBundle pathForResource:@&#8221;myPic&#8221; ofType:@&#8221;.png&#8221;];

NSString *path = [mainBundle pathForResource:@&#8221;myPic.png&#8221; ofType:nil];

//获取NSBundle里的Plist文件

NSString *plistPath = [mainBundle pathForResource:@&#8221;myList.plist&#8221; 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:@&#8221;jiangwei&#8221; forKey:@&#8221;name&#8221;];

    [p setValue:@22 forKey:@&#8221;age&#8221;];

    //通过kvc方式读取属性

    NSString *name = [p valueForKey:@&#8221;name&#8221;];       

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

    Book *book = [[Book alloc] init];

    Author *author = [[Author alloc] init];  

     //通过kvc方式设置对象

    [book setValue:author forKey:@&#8221;author&#8221;];

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

    //author中的issueBook字段是个NSArray

    //通过kvc方式获取数组的大小,语法:NSArray.@count

        NSNumber *count = [author valueForKeyPath:@&#8221;issueBook.@count&#8221;];

    //通过kvc方式获取书籍价格的总和,语法:NSArray.@sum+字段名

        NSNumber *sum = [author valueForKeyPath:@&#8221;issueBook.@sum.price&#8221;];

    //通过kvc方式获取书籍的平均值,语法:NSArray.@avg+字段名

        NSNumber *avg = [author valueForKeyPath:@&#8221;issueBook.@avg.price&#8221;];

    //通过kvc方式获取书籍的价格最大值和最小值,语法:NSArray.@max+字段名

        NSNumber *max = [author valueForKeyPath:@&#8221;issueBook.@max.price&#8221;];

        NSNumber *min = [author valueForKeyPath:@&#8221;issueBook.@min.price&#8221;];

2、kvc与字典

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

    self.name = dict[@&#8221;name&#8221;];

    self.icon = dict[@&#8221;icon&#8221;];

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

    [self setValuesForKeysWithDictionary:dict];

日期格式化

//取出当前时间

NSDate *currentDate = [NSDate date];

//设置时间格式

NSDateFormatter *formatter = [[NSDateFormatter alloc]init];

//时间的格式

formatter.dateFormat = @&#8221;yyyy-MM-dd HH:mm:ss&#8221;;

//获取时间的字符串

NSString *date = [formatter stringFromDate:currentDate];

《Objective-C:语法基础》 图片发自简书App


推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
author-avatar
aaaaaaaaaa本尊
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有