标注10天的课程,打算2天看完,改成3天看完,最后4天看完了,Objective-c基于c,加了面向对象的思想和自己的一些奇怪的语法,万变不离其宗。感觉最大的收获是学了很多内存管理的知识。(第一天的课程知识点因为电脑死机了丢失了)
- 要打印无符号的字符要用 %C 大写的C
- static关键字修饰局部变量会变成静态变量,下次也不会声明了
- 如果返回值是当前类的对象,直接用instancetype
- slef如果用在对象中指代对象,类中指代类
- 获取类对象 class 方法
- 要想让类有创建对象的能力,必须直接或间接继承NSObject类
- 子类可以从父类继承对象方法和类方法,调用父类的方法用super关键字
- 访问修饰符,如果不给修饰符,默认是@protected
- @private 当前类访问
- @protected 当前类和子类
- @package 当前框架
- @public 所有地方
- 访问修饰符只能修饰属性,不能修饰方法
- 可以把属性写在 @implementation的大括号里面,外界不会提示有这个属性,实现真私有
- 方法不写声明,只写实现那就是私有方法,外界不知道也无法调用
- %p可以打印指针变量的地址,%@打印指针变量指向的对象
- 用%@打印指针变量相当于调用了description方法
- 每个子类中都有一个指向父类的isa指针,一直指到NSObject
- 结构体在栈里面,只有属性可以用它
- 内存中有五个空间
- 栈 :局部变量
- 堆 :自行申请的空间
- bss段 : 未初始化的全局变量,静态变量,一旦初始化就回收,并转到数据段之中
- 数据段 : 已经初始化的全局变量,静态变量,知道程序结束才会回收
- 代码段 :代码,程序结束就回收
- 类是以Class对象的形式存储在代码段中
- 调用方法有两种方式:对象直接调用;通过类对象的sel对象
- 点语法是对属性setter和getter方法的转换,慎用点语法
- @property自动为属性添加setter和getter声明,具体实现还是要自己写
- @synthesize自动生成setter和getter的实现
@synthesize 属性名 //会生成私有属性,和声明的属性无关了
@synthesize 属性名 = _属性名 //用这种方法才会实际操作声明的属性
- OC是一门弱语言,编译不报错,运行才可能报错
- 如果方法的内部是生成当前类的对象使用 [self new]
- 如果方法的返回值是当前类的对象,使用instanceType
- 判断当前对象是否有某个方法 [对象 respondToSelector:@selector(方法名)]
- 判断当前对象是否是某个类或子类的实例 [对象 isKindOfClass:[类名 class]]
- 判断当前对象是否是某个指定类的实例 [对象 isMemberOfClass:[类名 class]]
- 判断类中是否有指定的类方法 [类名 instanceRespondToSelector:@selector(方法名)]
- 当使用NSObject去访问对象属性的时候编译器会做检查,当使用id的时候编译器不会检查
- @property四组参数及其默认值
- atomic(默认值),nonatomic
- assign(默认值),retain
- readwrite(默认值),readonly
- getter=方法名,setter=方法名:修改getter和setter方法的名字
- 如果两个文件用#import相互引用,会无限递归,编译都无法通过,解决方法是让一方用@class
- #import和@class的区别是#import会拷贝文件,而@class不会
- 使用了@class需要在.m文件中#import,不会无法调用方法
- 如果两个OC对象使用retain相互引用,会发生内存泄漏,这时让一方使用assign
- 引用计数器占8个字节是无符号的long
- 内存泄漏发生的原因
- 有对象的创建,没有匹配release
- retain和release不匹配
- 指针胡乱赋值nil
- 不合理的使用retain
- setter方法赋值时记得释放之前的
- 对象声明默认时强指针的,如果没有强指针指向对象,那么会被立即回收,包括使用弱指针指向的对象
- 在ARC模式下,@property的参数不能使用retain,因为其生成的setter方法会自动进行指针计数器操作
- 在ARC模式下,如果两个对象相互应用如果都使用强引用会出现内存泄漏,解决是一端使用weak
- 在开发中内存的管理模式
- MRC
- ARC
- ARC和MRC的兼容 使用 -fno-objc-src
- 可以把MRC程序转换成ARC程序
- ARC和垃圾回收机制的区别,垃圾回收机制时运行时,ARC是编译时插入retain。。。
- block内部可以修改定义为全局变量的值,但是不不能修改局部变量的值,如果要修改加上 __block的修饰符
- 但block作为函数的返回值时,必须是使用typedef定义的
- @required和@optional是专门用来修饰协议的声明的
- 使用NSString *str = @“”;创建的字符串存在数据段的常量区,使用构造方法创建的字符串存在堆里面
- 创建字符串对象时,系统先判断内存是不是有这个对象,没有创建,有就直接赋值
- 存储在常量区的对象不会被回收
- 判断字符串是否包含了某个字符串,用rangeOfString 返回0代表没有
- NSArray
- 只能存储OC对象
- 最后要写个nil代表结束
- 可以使用NSArray *arr = @[...];此方法创建数组后面不要写nil
- 不能用@[...];这种方式定义NSMuTableArray对象,因为这是子类引用指向父类对象了
- 在OC中,任意引用指向任意对象编译不报错,运行会报错
- 可以使用一个@将数字转成NSNumber @10 @(mynum)
- NSDictoinary的key只能时遵守了NSCopying协议的对象,value只能是OC对象
- 往字典添加相同key的value,后加的无效
- 直接打印字典,key是按ascll排序的
- 字典村数据的下表是根据key和数组的hash值来确定的,取值的时候也是通过计算key的hash值来获取对应的value
- 用NSFileManager来操作文件
- OC有几个个常见的结构体 CGPoint/NSPoint表示坐标和CGSize/NSsize表示大小,CGRect/
- NSValue用来包装结构体变量
- NSData,NSDataformater,NSCaladar
- copy和MutableCopy除了NSString的copy是浅拷贝,其他都是深拷贝,浅拷贝拷地址,深拷贝拷对象
- 如果定义了一个NSString类型的引用,用copy
- 要让自定义的类实现拷贝能力,不要实现NSCopying协议,实现copyWithZone方法
- 实现单例--》重写allowWithZone
+(intancetype)allowWithZone:(NSZone *)zone{
static id instance;
if(instance == nil){
instance = [super allowWithZone:zone];
}
return instace;
}
标签:对象,ARC,Objective,属性,方法,class,setter
From: https://www.cnblogs.com/maowuge/p/16617188.html