一、Objective-C@的用法
- Objective-C的关键字都以@开头。
- 其他作用
@[ ] 创建不可变数组
@{ } 创建不可变字典,
@( ) 能把常量或变量变成字面对象
二. 预编译指令
作用:对代码的分组,方便代码查找和导航
@pragma mark 标识符
@pragma mark -
三、OC中的三种注释:
单行注释:
//我是注释的内容多行注释:
/* 我是华丽丽的注释内容 */文档注释,作用:让自己定义的方法(函数)在Xcode输入时弹出提示,用来说明此方法(函数)的作用
/**
* 木有错,我就是传说中的文档注释 *
*/
四、成员变量和实例变量
成员变量:基本数据类型定义的变量
实例变量:OC类定义的变量
五、结构体赋值
// 直接赋值
struct Person {
char name[10];
int sex;
}xiaoming = {"xiaoming",1};
// 间接赋值
struct Person xiaom;
xiaom.name = “xiaoming”;
xiaom.sex = 1;
struct Person xiaoming = xiaom;
// 强制转换赋值
struct Person xiaoming = (struct Person){"xiaoming”,1};
六、结构体与类的区别
结构体变量存在栈里面,类实例化出来的对象存在堆里面
结构体里面不能写函数,类里面可以写函数并且可以写方法
结构体成员没有访问权限的说法,类的成员有@public @private @protected三种
结构体不可以被继承,类可以继承
结构体的思想属于面向过程的思维,类是面向对象的产物
七、函数和对象方法的区别
语法区别,并且对象方法都以-号开头,函数直接以返回值开头
对象方法的声明只能写@interface…@end中间(不包括写成员变量处)、对象方法的实现
只能写在@implementation…@end中函数属于整个文件,可以写在文件中的任何位置,包括@implementation…@end中,但写@interface…@end会无法识别,函数的声明可以在main函数内部也可以在main函数外部
对象方法只能由对象来调用,不能像函数一样直接调用
对象方法可以访问当前类的成员,函数哪怕写在@implementation里也不可以直接访问类的成员
6.C函数的定义不能在@interface中,声明可以在。
八、类方法使用
类方法的优势:可以不依赖对象,不占用内存空间
类方法可以和实例方法同名。
类方法和实例方法一样在@interface里声明,在@implementation里实现。
类方法只能被类调用执行,向实例对象发送类方法是不能被触发执行的。
类方法里面不能直接使用实例成员
类方法里面可以调用其他类方法,不可以直接调用对象方法
对象方法里面可以调用类方法
九. 对象与对象之间的关系
组合关系:整体与局部
依赖关系:一个对象作为另外一个对象的参数
关联关系:一个对象作为另一个对象的实例变量,且它们之间不是组合关系
注:组合和关联用法一样。
十. C和OC中的字符串
OC中的字符串是NSString类型,长度用length计算,中英文都各自只占一个字节。
在Xcode中C语言中一个汉字占3个字节,英文占一个字节。
十一. 匿名对象
没有变量名,创建后直接用,不进行赋值。
只能对成员变量赋值一次。
只能调用一次方法。
用法类似于类方法:
区别:匿名对象创建的了空间,类不创建空间
缺点:会造成内存泄露
十二. description
辅助NSLog输出
NSLog(@”%@”, objectA);这会自动调用objectA的descriptong方法来输出ObjectA的对象信息同时使用了%@和self,代表要调用self的description方法,因此最终会导致程序陷入死循环,循环调description方法
在一个类中重写- (NSString *)description;可以改变使用 NSLog通过%@输出的格式,当在某个地方用NSLog输出这个类时,会输出自己设定的格式,输出的格式只对本类有效,对其他类无效。
description 返回什么,NSLog就输出什么
十三. self和super
两者都只在方法中使用
self关键字: 谁调用当前方法,self就代表谁;在对象方法中,代表当前对象;在类方法中,代表类。
super关键字:显示地调用父类中的方法;在使用super时,他们的关系必须是父子关系
十四. 不能为id变量类型用点运算符,编译器会报错
十五. 在方法中给属性赋值时,使用self会调用setter方法,直接用带有下划线的开头的成员变量赋值,不会调用setter方法
十六. 非正式协议
非正式协议:没有实现的部分的分类。一般为“NSObject”的分类,然后列出方法名,可以没有.m文件;使用的时候直接继承就可以,然后子类去实现分类的里面的方法。
十七. 快捷代码块
把代码拖入快捷代码区,点击编辑:在需要改变的地方加上<#name#>
十八. @synthesize和@property
@synthesize t,k; 生成的成员变量前面不带下划线
指定成员变量@synthesize t = _t
只用@property会生成前面带下划线的成员变量。
十九. 自动释放池注意点
自动释放池并不包含实际对象,而只是包含对象的引用,对象将在自动释放池清理的时候释放。
使用对象的方法时,对象的引用计数不加1,当对象用作传值时,传入其他的对象方法时,引用计数加1
二十. ARC方法命名
当ARC遇到方法调用时,会检查方法名,如果名字以alloc、new、copy、mutableCopy、init这些词开头且驼峰拼写,它会假定方法返回对象的所有者给方法的调用者。
二十一. 不能用import导入.m文件,会导致重复编译,可能会有多个.o文件
二十二. 多态
父类指针指向子类的对象
父类不能调用子类独有的方法;当父类要使用子类的方法时,可以强制类型转换
原因:编译器在编译时只检查指针变量的类型下的方法,如果有就运行,没有就报错,运行时去调用子类的方法
二十三. 方法和成员变量都可以重新定义,但必须是在.m文件中,在.h文件中会报错。
二十四. iOS开发new与alloc/init的区别
new和alloc/init在功能上几乎是一致的,分配内存并完成初始化。
区别:alloc分配内存的时候使用了zone,它是给对象分配内存的时候,把关联的对象分配到一个相邻的内存区域内,以便于调用时消耗很少的代价,提升了程序处理速度。
二十五. 条件运算符Xcode支持如下扩展
A ? :B 相当于 A ?A : B