Objective-C的基础语法总结
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 <NSCopying,NSCoding>{//采用了两个协议
//实例变量
}
//方法声明
@end
注意###:协议名称是使用尖括号括起来的,当采用多个协议时,可以按任意顺序列出,没有先后顺序的影响。
22.复制(copy)分为浅层复制(shadow copy)和深层复制(deep copy)。
浅层复制:不复制引用对象,新复制的对象只只想现有的引用对象。NSArray类的copy方法是浅层复制,当复制一个NSArray类的对象时,你复制的对象只复制指向引用对象的指针,而不复制引用对象本身。如果复制一个NSArray类的对象,该对象包含5个NSString类的对象,则你最终得到的是5个可供程序使用的字符串对象,而不是10个字符串对象。
深层复制:将复制所有的引用对象。如果NSArray类的copy方法是深层复制,则在复制操作完成后得到10个可用的字符串对象。
Objective-C的基础语法总结的更多相关文章
- Swift与C#的基础语法比较
背景: 这两天不小心看了一下Swift的基础语法,感觉既然看了,还是写一下笔记,留个痕迹~ 总体而言,感觉Swift是一种前后端多种语言混合的产物~~~ 做为一名.NET阵营人士,少少多多总喜欢通过对 ...
- iOS-----正则表达式的基础语法
正则表达式简单语法总结 一.什么是正则表达式 从概念上来说,正则表达式也是一门小巧而精炼的语言,它可以用来简化检索特定的字符串,替换特定字符等功能,有许多开发语言工具,都内嵌支持正则表达式.那么一个正 ...
- python之最强王者(2)——python基础语法
背景介绍:由于本人一直做java开发,也是从txt开始写hello,world,使用javac命令编译,一直到使用myeclipse,其中的道理和辛酸都懂(请容许我擦干眼角的泪水),所以对于pytho ...
- emmet 系列(1)基础语法
emmet 系列(1)基础语法 emmet 是一个能显著提升开发html和css开发效率的web开发者工具 emmet基本上目前已知的编辑器都有相应的插件,各个编辑器的emmet插件的下载地址:点我下 ...
- Scala基础语法 (一)
如果你之前是一名 Java 程序员,并了解 Java 语言的基础知识,那么你能很快学会 Scala 的基础语法. Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ; 是可选的. 我 ...
- Java基础语法
java基础学习总结——基础语法1 一.标识符
- javascript中正则表达式的基础语法
× 目录 [1]定义 [2]特点 [3]元字符[4]转义字符[5]字符组[6]量词[7]括号[8]选择[9]断言[10]模式[11]优先级[12]局限性 前面的话 正则表达式在人们的印象中可能是一堆无 ...
- Swift基础语法学习总结(转)
Swift基础语法学习总结 1.基础 1.1) swift还是使用// 和/* */ 来注释,并且/* */允许多行注释. 1.2) swift使用print和println打印,它的传参是一个泛型 ...
- 黑马程序员——OC语言基础语法 面向对象的思想
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结)(一)基础语法 1)关键字 @interface.@implementati ...
- 【OC基础语法考试】
OC基础语法已经全部学完,但是这些知识只是最基础的,还有很多高级知识,这个可能需要后面慢慢的去学习才能体会到.接下来我会总结前面的OC基础语法,如果大家发现有什么不正确的地方,请指正,小弟是新生,多请 ...
随机推荐
- BIP_开发案例04_通过BI Publisher实现打印报表的二维码(案例)(待整理)
2014-01-01 Created BaoXinjian
- IGS_学习笔记07_IREP通过页面测试客户化Web Service调用(案例)
20150819 Created By BaoXinjian
- c++代码模板
c++代码模板 &代码: #include <bits/stdc++.h> using namespace std; typedef long long ll; const int ...
- 用imageROI来增加某范围的像素
//用imageROI来增加某范围的像素 //作者:sandy //时间:2015-10-5 #include <cv.h> #include <highgui.h> int ...
- DataGridView操作
C# DataGridView控件动态添加新行 DataGridView控件在实际应用中非常实用,特别需要表格显示数据时.可以静态绑定数据源,这样就自动为DataGridView控件添加相应的行.假如 ...
- centos7编译安装nginx1.8
安装pcre wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.38.tar.gz tar -zxvf pcre-8. ...
- PopuWindow_2
点击一个popupwindow窗口之外的区域popupwindow消失,带来的问题!! popupwindow窗口之外的区域popupwindow消失 , 以前说过需要设置: mPopupWindow ...
- java中四种引用类型(转)
今天看代码,里面有一个类java.lang.ref.SoftReference把小弟弄神了,试想一下,接触java已经有3年了哇,连lang包下面的类都不了解,怎么混.后来在网上查资料,感觉收获颇多, ...
- Eclipse中generate getter and setter对boolean的反应
有点意思 , 如果变量是boolean类型的 ,就会生成isxxx开头的getter方法 , 但如果是Boolean对象的 , 就会生成getterxx开头的getter对象. 例如 Boolean ...
- Linux设置服务自启动(转载)
From:http://www.cnblogs.com/nerxious/archive/2013/01/18/2866548.html 有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统 ...