首页 > 其他分享 >Objective-c

Objective-c

时间:2022-08-26 18:35:41浏览次数:56  
标签:对象 ARC Objective 属性 方法 class setter

标注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

相关文章

  • Objective-C的IDE开发集成环境
    AppCodeforMac是适用于Mac操作系统的全新智能Objective-C的IDE开发集成环境,帮助开发者来开发Mac、iphone和iPad等iOS系统的相关应用程序,是从事iOS开发工作者必不可少的工......