OC部分知识点罗列
1、什么是方法名?什么是方法类型?
方法名,去掉参数、去掉返回值,剩下的所有是方法名。
例如:-(id)setName:(NSString*)name:(NSString*)sex age:(int)age
方法名为:-setName::age;
2、一个对象调用autorelease 看他什么时候释放?
[str autorelease];
等出池后即倒序释放。
3、协议关键字默认
在代理delegate中,属性关键字为assign;
首先delegate要使用assign而不是retain,这个问题大家通过看iOS的api就可以了,最典型的是tabView里面的delegate和datasource都是用的assign。
那为什么要使用assign而不是retain呢?
其实这个问题从很多方面可以说通的。
首先,考虑类的设计模式,类与类之间大体关系有继承和聚合的关系,当我们使用聚合的时候该对象就拥有聚合的对象,这时候我们就需要retain使引用计数器+1来控制该对象的内存管理,所以我的感觉retain和copy的一项能力就是拥有该对象的内存管理权。
下面就得说delegate了,一个对象没必要管理自己delegate的生命周期,或者说没必要拥有该对象,所以我们只要知道它的指针就可以了,用指针找到对象去调用方法,也就是委托实现的感觉。
或者我们换个角度,从内存管理方面也可以解释这个问题。delegate的生命周期不需要让该对象去控制,如果该对象对其使用retain很可能导致delegate所指向的对象无法正确的释放。
4、字典集合的关键字
key-value无序排列。
5、关于类的描述
类的接口部分可以包含实例变量、属性和方法。
可以把声明和实现都放到.h文件中。
一对文件(.h和.m)可以定义多个类。
6、什么是类目?
category;
category内不能定义实例变量;
category内方法与母类中方法是平等地位;
7、什么是对象,如何确定一个是不是对象?
抽象的类,具体的对象。
8、属性的属性assign retain copy区别与联系?
assign:多数情况下用于基本变量类型;
retain:用于对象类型;
copy:用于遵守NSCopying协议的对象类型;
9、setter方法内部不能用setter递归调用
禁止在setter方法里面使用点语法,因为点语法本身就是set方法,这样造成了递归调用。
10、可变字符串跟不可变字符串的区别,可变字符串改的还是自己。
这里需要注意的是,当空间足够的时候,改变前后地址相同。
11、字典里面key是唯一的,当key的时候,新value会覆盖旧value
这点在读写程序时候容易忽略。
12、类方法里面不能使用实例变量。
因为类方法是向类发送消息,实例变量是对象的实例变量。
13、delloc方法什么时候调用,以及其意义。
当retainCount值<1的时候,系统会自动调用dello方法。
14、内存管理。
如何取管理内存?
内存管理遵循的原则?
15、初始化方法是用来做什么的?
初始化方法是用来给给变量赋初值的。不要把初始化方法跟alloc开辟空间搞混了。
16、如何去声明一个Block变量?
区别声明一个Block与定义一个block
声明 BOOL(^block)(NSString*,NSString*)
定义 BOOL(^block)(NSString*,NSString*)=^BOOL(NSString *str1,NSString *str2)
{
return [str1 isEquleToString:str2];
}
17、属性的setter方法实现。
注意retain和copy的方法实现。
18、便利构造器如何去写?
+(Student*)studentWithName:(NSString*)name
{
Student *stu=[[Student alloc]initWithName:name];
return [stu autorelease];
}
19、如何autorelease对象?
给需要释放的对象发送autorelease消息,然后一起放入释放池 。
[stu autorelease]
20、id是一个指向任意对象类型的指针。