1、在OC中,[ ]是用来调方法,. 也是找方法,主要是找get方法,->是用来找变量的。_p是直接访问实例变量。
2、在OC中,实例变量是保护类,不可以在外部访问,但是,在使用@property和@synthesize时,就相当于有了set函数和get函数。
3、build setting中将autorelease reference counting 自动引用计数器设置为no,即开启MRC。
4、深拷贝:增加了一个指针并重新开辟了一块空间,这个增加的指针指向了新开辟的空间,采用这种方式的拷贝,防止出现重复释放内存。copy就是深拷贝。
浅拷贝:增加了一个指针指向一个已经存在的内存空间。retain就是一个浅拷贝。
5、@property的参数是readonly时,不会生成set函数,所以就不能用self来调用,直接使用_+变量名
6、atomic:对每一个变量进行加锁操作,(共同抢夺同一块资源,例如“内存,”),加锁操作是能够使资源被一个变量使用,不会出现因为相互等待而出现“死锁”,浪费资源(调配使用,分配使用顺序,耗时)多用在单线程,偶尔也会用在多线程上。
nonatomic:防止给变量加锁,节约系统资源。
加锁:就是线程同步,避免多个线程同时访问全局变量导致数据被破坏,某个线程加了锁之后,操作完再把锁释放,期间要是有其他线程想去访问被加锁的变量就需要先拿到锁,而锁没有释放的话,就只有等待,直到拥有锁的线程把锁释放,表示可以操作它了
7、前向声明:组合类的头文件处使用前向声明,在.m文件中导入头文件。
8、线程安全:代码运行在多线程环境下和运行在单线程曾环境下结果是一样的。
9、组合类:组合类在.h文件中,使用参数retain。
Strong:系统提供的、自定义的指针使用。与MRC情况下的retain使用情况类似。
Weak:弱引用。只要有一个指针不指向它,就释放掉内存。
Copy:在ARC下也可以使用,相当于assign。但是使用copy,需要实现nscopying协议中的copywithzone方法:
MRC下使用retain、copy, 但是copy在ARC下也可以使用。
10、autorelease加长了对象的生命周期,让对象的释放时机延长,浪费了内存,在MRC下尽量使用release,但是具体使用,一般是在多个文件调用这个对象,不确定什么时候释放的时候,才使用autorelease。
11、在Object-C中使用结构体和枚举:(1)访问结构体变量的某个成员,使用.成员访问运算符。(2)结构体指针->结构体成员名。(3)(*结构体指针).结构体成员名
12、typedef struct OC_object{
Class isa;
}* id;
id :本身的类型可以转化为任何一种对象,作为返回值是一个确定的类型。d可以用来表示任意一个对象,它是一个 objc_object 结构类型的指针,其第一个成员是一个 objc_class 结构类型的指针。在返回值类型、行参类型、参数类型时使用。
isa:实例对象的isa指向它的类。一个对象(Object)的isa指向了这个对象的类(Class),而这个对象的类(Class)的isa指向了metaclass。Object-C对类对象与实例对象中的 isa 所指向的类结构作了不同的命名:类对象中的 isa 指向类结构被称作 metaclass,metaclass 存储类的static类成员变量与static类成员方法(+开头的方法);实例对象中的 isa 指向类结构称作 class(普通的),class 结构存储类的普通成员变量与普通成员方法(-开头的方法).
类的实例对象的 isa 指向它的类;类的 isa 指向该类的 metaclass;类的 super_class 指向其父类,如果该类为根类则值为 NULL。metaclass 的 isa 指向根 metaclass,如果该 metaclass 是根 metaclass 则指向自身;metaclass 的 super_class 指向父 metaclass,如果该 metaclass 是根 metaclass 则指向该 metaclass 对应的类;Object-C 为每个类的定义生成两个 objc_class ,一个普通的 class,另一个即 metaclass。我们可以在运行期创建这两个 objc_class 数据结构,然后使用 objc_addClass将 class 注册到运行时系统中,以此实现动态地创建一个新的类。
13、多态:用一个父类的指针指向子类的对象,在运行时调用到正确的版本。
(1)用一个基类的指针指向一个子类
(2)将父类指针作为形参,可以使用其子类和本身作为参数传递
(3)在复合类中,最好引用高层次的类当做类的成员变量
14、自动释放池:(1)一定要在自动释放池中调用autorelease,才会将对象放入自动释放池中。(2)在自动释放池中,一定要调autorelease,才会将对象放入自动释放池中。(3)只要在自动释放池中调用autorelease,就会将对象放入自动释放池中。
15、分类和扩展:分类可以为类添加方法,但是不可以添加变量。扩展既可以添加方法,又可以添加变量。但是如果是单独写的一个扩展文件,那就可以访问到变量和方法。如果将类的扩展写到类的.m文件中,既不可以访问到变量,也不可以访问到方法。
16、字符串操作:
17、NSArray创建使用NSArray *ary = [[NSArray alloc] initWithObjects:@”jeo”,@”jun”,nil];在多个文件中使用时,自己手动开辟,不会被回收。而NSArray *arr = [NSArray arryayWithObjects:@”jeo”,@”jun”,nil];也可以使用NSArray *ary = @[@”hello”,@”world”];(这种是在iOS8之后出现的)
是系统管理的,如果在多文件中使用,会造成程序挂掉。
某个对象在数组中是否存在,返回BOOL值:[arr containsObject:@”jeo”];
对数组进行排序,使用系统的方法:NSArray *ary = [arr sortedArrayUsingSelector:@selector(compare:)];因为该方法的排序不影响原数组的顺序,需要用新的数组进行接收。
快速遍历数组;
for(id num in ary){NSLog(@”%@”,num);}数组中存在不同类型的对象,使用id最好,可以接收任何类型的对象。
18、字典:没有先后顺序之分,因为字典是无序的
19、文件存储存储的是基本的对象,自己写的类和对象是写不进去的,想要写进自己编写的类,就要遵循NSCoding协议,对文件总的变量编解码,实现-(void)encodeWithCoder:(NSCode *)aCoder;进行编码
-(instanceType)initWithCoder:(NSCode *)aDecoder;进行解码
但是编码的都是对象,要将基础类型的变量转换为对象。然后将类的对象存入文件(归档):Person *p = [[Person alloc] init];
[NSKeyedArchiver archiveRootObjectObject:p toFile:str];
Person *p = [NSDeyedUnArchiver unArchiveObjectWithFile:str];
创建文件管理类:NSFileManager,一般使用defaultManager,常使用的类:-(NSData *)contentsAtPath:(NSString *)path;属性currentDirectionaryPath管理目录。NSHomeDirectionary获取主目录,而[[NSFileManager defaultManager] currentDirectionary]获取当前目录。
20、循环引用:
1、循环引用其中一个变量使用assign模式
2、在dealloc中为assign模式的不用release