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

ObjectiveC的基础语法总结

1.NSLog(@“helloworld!”);打印语句的函数,需要打印的字符串放在@之后。NSLog(@“are%dand%ddifferent?%@”,4,4,@”YES”);

1.NSLog(@“hello world!”);//打印语句的函数,需要打印的字符串放在@之后。

NSLog(@“are %d and %d different?%@”,4,4,@”YES”);

2.方括号有两个作用:

1)访问数组元素

2)用于通知某个对象执行什么,在方括号内第一项是对象,其余部分是需要对象执行的操作。例如,[shape draw]的含义为通知shape执行draw方法。

3.方法调用:类名 方法名:参数

注意:如果方法使用参数,则需要冒号;否则不需要冒号。

4.类的编写:

头文件中:@interface name

                ….//声明方法

               @end

实现中:@implementation name     注意:此行没有逗号

….//代码实现,其顺序可以不与头文件声明的顺序一致;

.....//另外,也可以定义那些头文件中未声明的方法,可以把它们当做私有方法,仅在类的 .....//实现中使用

            @end

5.OC的方法实现时要注意调用的先后顺序:

  例如A方法中需要调用B方法,则B方法需要在A方法之前实现。

 

6.实例化对象

 

7.C++具有多继承特性,但Objective-C不支持多继承,继承是指两个类之间的关系,避免出现很多重复代码。

 

8.OC继承知识:

当子类中重写父类方法并调用此方法时,会完全忽略父类中该方法的实现,为了避免忽略父类方法,可以通过super关键字,此时调用子类的重写方法时仍然会调用父类的实现方法。

 

9.复合是通过包含作为实力变量的对象指针实现的,严格来讲,只有对象间的组合才称为复合。

10.@class创建一个前向引用,就是在告诉编译器:“相信我,以后你会知道这个类到底是什么,但是现在,你只需要知道这些”。

如果有循环依赖关系,@class也很有用。即A类使用B类,B类也使用A类。如果试图通过#import语句将这两个类互相引用,那么最后就会出现编译错误。但是如果在A.h中使用@class B,在B.h中使用@class A,那么这两个类就可以互相引用了。

 

11.集合框架NSArray有两个限制(NSArray是不可变对象的数组):

(1)只能存储Objective-C的对象,不能存储C语言中的基本数据类型,如int,float,struct,enum等。(2)不能再NSArray中存储nil。

**  创建NSArray对象:arrayWithObjects:…,....,...,....nil;发送一个以逗号分隔的对象列表,在列表结尾添加nil代表列表结束。例如,NSArray * array;

array = [NSArray arrayWithObjects:@“one”,@“two”,@“three”,nil];

** 获取指定索引的对象方法objectAtIndex:

** 将字符串切分为NSArray对象的方法componentsSeparatedByString:();

 

12.可变数组NSMutableArray,可以随意的添加和删除元素,但数组本身一直是不变的。

** 创建可变数组对象NSMutableArray arrayWithCapacity:3;

** 调用-(void)addObject:(id)anObject;在数组末尾添加对象。

** 调用-(void)removeObjectAtIndex:(unsigned)index;//删除指定索引处的对象。当删除相对靠前索引处的元素时后面的数组元素都被前移来填补空缺。

** 遍历数组时还可以通过NSEnumerator实现,具体代码如下:

        //通过NSEnumerator遍历数组

        NSEnumerator* enumerator;

        enumerator = [tArray objectEnumerator];

        id thingid;

        while (thingid = [enumerator nextObject]) {

            NSLog(@"I found %@",thingid);

        }

 

**快速枚举:

        //快速枚举

        for(NSString * tmp in tArray){

            NSLog(@"I found %@",tmp);

        }

13.集合框架NSDictionary:(121页)

类似Java中的map,使用的是键查询的优化存储方式,跟NSString,NSArray一样是不可变的对象。

 

14.NSArray和NSDictionary只能存储对象,不能存储基本类型数据,因此OC中提供了NSNumber类用来包装基本类型数据(即以对象形式实现)。

+(NSNumber*) numberWithChar:(char)value;

+(NSNumber*) numberWithInt:(int)value;

+(NSNumber*) numberWithFloat:(float)value;

+(NSNumber*) numberWithBool:(BOOL)value;

通常将一个基本类型的数据包装成对象叫做装箱,从对象中提出基本类型的数据叫做取消装箱。OC不支持自动装箱。

 

15.NSSortDescriptor对象进行数组排序

 

===========内存管理规则:如果使用new,alloc,或copy方法获得一个对象,则该对象的保留计数器的值为1,而且要负责释放它========================================

 

16.简化接口

@property预编译指令的作用是自动声明属性的setter和getter方法。

例如:以往我们的一对方法如下所示:

@interface car{

float engine;

}

-(void)setEngine;//设置方法

-(id)engine;//获取对象方法

@end

现在可以用更具有特性的写法实现,具体如下:

@interface car{

float engine;

}

@property float engine;//代替了上面的setEngine和engine方法,用在头文件中

@end

17.简化实现

@synthesize engine;//是一种新的编译器功能,表示“创建该属性的访问器”,当遇到代码@synthesize engine;时,编译器将输出setEngine和engine方法的已编译的代码。

 

***@ property特性只支持上面提到的那种方式,不支持那些需要接收额外参数的方法。

 

18.只读性:@property特新默认是可读写的,但是比如驾驶证号码或身份证号码这类特性,我们不希望任何人更改它,我们可以使用@property的只读属性。例如:

@property (readonly) float shoeSize;

编译器将只为该属性生成一个getter方法而不生成setter方法。

 

19.类别是一种为现有的类(例如类库等)添加新方法的方式。类别还提供了将对象的实现分散到多个不同的源文件、甚至多个不同的框架中的方法。

** 类别的声明格式与类的声明格式类似:

@interface NSString (NumberConvenience)

-(NSNumber*) lengthAsNumber;

@end

上述代码的含义是,类别的名称是NumberConvenience,而且该类别将向NSString类中添加方法。即向NSString类中添加一个名称为NumberConvenience的类别。只要保证类别名称的唯一性,可以向一个类中添加任意多的类别。另外,类别中不能声明实例变量。

** 类别实现

在@implementation部分实现自己的方法

@ implementation NSString (NumberConvenience)

-(NSNumber*) lengthAsNumber{

//实现代码。。。

}

@end

类别的局限性:1.不能添加新的实例变量;2.名称冲突,即类别中的方法与现有的方法重名。当发生名称冲突时,类别具有更高的优先级。

 

20.委托(不太懂),方法的选择器

利用类别可以声明非正式协议。非正式协议是NSObject的一个类别,它可以列出对象能够相应的方法。非正式协议用于实现委托,委托是一种允许你轻松定制对象行为的技术。

选择器是一种在代码中指定特定的Objective-C消息的方法。

 

21.正式协议

*)下面介绍协议的声明

@protocol NSCopying

-(id)copyWithZone:(NSZone*) zone;

@end

注意协议的声明时,协议名称必须唯一,协议的每一个采用者都必须实现这些方法,使用协议不引入新的实例变量。

*)采用协议

@interface Car:NSObject {//采用了两个协议

//实例变量

}

//方法声明

@end

注意###:协议名称是使用尖括号括起来的,当采用多个协议时,可以按任意顺序列出,没有先后顺序的影响。

 

22.复制(copy)分为浅层复制(shadow copy)和深层复制(deep copy)。

浅层复制:不复制引用对象,新复制的对象只只想现有的引用对象。NSArray类的copy方法是浅层复制,当复制一个NSArray类的对象时,你复制的对象只复制指向引用对象的指针,而不复制引用对象本身。如果复制一个NSArray类的对象,该对象包含5个NSString类的对象,则你最终得到的是5个可供程序使用的字符串对象,而不是10个字符串对象。

 

深层复制:将复制所有的引用对象。如果NSArray类的copy方法是深层复制,则在复制操作完成后得到10个可用的字符串对象。


推荐阅读
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • Introduction(简介)Forbeingapowerfulobject-orientedprogramminglanguage,Cisuseda ... [详细]
  • IvebeentryingforadayortwototryandgetashadowtodrawinsidethetextofanNSTextField ... [详细]
  • jsappsugar,基于,js,语法,定义 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • Iamtryingtocreateanarrayofstructinstanceslikethis:我试图创建一个这样的struct实例数组:letinstallers: ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
  • 如何设置UIPick ... [详细]
author-avatar
jackiex2620
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有