ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Objective-c

2022-08-26 18:32:56  阅读:172  来源: 互联网

标签:对象 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
来源: https://www.cnblogs.com/maowuge/p/16617188.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有