首页 > 其他分享 >OC学习笔记[注意事项]

OC学习笔记[注意事项]

时间:2023-06-11 14:00:59浏览次数:34  
标签:注意事项 OC 笔记 stu book Student import release retain


alloc  new  retain之后都必须要调用release方法 计数器要变只有这几种方法 retain release alloc new copy方法才会使计数器改变,谁想用人家对象,就对他进行retain操作,但在dealloc释放本对象的时候也释放引用的对象,先释放引用的对象,然后释放自己,


内存管理做到”谁污染谁治理“,谁调用谁retain,是销毁 也要销毁retain的对象


当自己手动写get和set方法的时候,系统就不会帮我们生成synthesize,就不会自动产生下划线对象,所以在手动写get和set方法的时候如果用到下划线字段就会报错



excu_bad_access就是野指针错误,访问了一个不属于你的内存空间


单例中千万不能写dealloc方法


assign:相当于str=str+1,是潜拷贝。对基础数据类型,(NSInteger,CGFloat)和C数据类型(int,float,  



       double,char,等等)



copy:对NSString



retain:对其他NSObject和其子类



assign:相当于str=str+1,是浅拷贝。对基础数据类型,(NSInteger,CGFloat)和C数据类型(int,float, 

       double,char,等等)

copy:对NSString

retain:对其他NSObject和其子类

NSMutableString *str1 = [NSMutableString stringWithString:@"mmmmmm"];
         NSString *str2 = [str1 copy];  //拷贝一份出来,如果不用copy的话,后面对str1进行修改,那么也会影响str2的赋值
         [str1 appendString:@"asdf"];
         [str1 release];
         NSLog(@"%@",str2);




用点语法,引用计数器就加1



-(id)initWithCoder:(NSCoder *)aDecoder{ 
 
 
 
if(self = [super init]){ 
 
 
 
self.name = [aDecoder decodeObjectForKey:@"name"];    //用了.语法,它的引用计数器就会+1 
 
 
 
self.email = [aDecoder decodeObjectForKey:@"email"]; 
 
 
 
} 
 
 
 
return self; 
 
 
 

   } 
 
 
 
 
  
 
 

   retain: 
 
 
 

   -(void)setName:(NSString *)name{ 
 
 
 

       if(_name != book){   //判断传进来的对象是否等于当前对象,如果不等,则释放之前的对象,再retain新对象 
 
 
 
[_name release];  //会自动释放当前的对象,    防止原先stu.book = book0;接着stu.book = book1;那么book0就会有内存泄露,没有被释放,这个的话很好的防止了这一点,这也就是retain的作用 
 
 
 
_name = [name retain]; 
 
 
 

       } 
 
 
 

   } 
 
 
 
 
  
 
 
 
  
 
 

   [stu release]; 
 
 
 

   [stu release]; //野指针(会报错)  野指针指指向的内容不属于你的 
 
 
 

   stu = nil;//指将指针所指向的那条线给擦掉 
 
 
 

   [nil release]; //空指针(不报错)  空指针指指向的线断了,等于不指向什么内存空间



@class Student 在子类中申明Student是一个类,就不需要写@import "Student.h",因为那样会降低性能,import相当于把所有的头文件都拷贝过去了,在.m文件中写@import "Student.h",因为.m文件中真正要使用Student的那些方法。



@class有些功能 @import是做不到的  当两个类相互包含的时候,相互@import的时候就会出错,但@class相互包含就不会报错,只是什么这是一个类,如果有上百个类都要引用Student这个类,那么用@import的话,只要Student类中有一点点改变,这些都要重新



编译,所以还是用@class比较好

标准的set方法(也就是retain的内部实现机制) 
 
 
 

   -(void)setBook:(Book*)book{ 
 
 
 
if(_book != book){ 
 
 
 
[_book release]; 
 
 
 
_book = [book retain]; 
 
 
 

   } 
 
 
 
 
  
 
 

   标准的dealloc方法 
 
 
 

   -(void)dealloc{ 
 
 
 
[_book release]; 
 
 
 
[super dealloc]; 
 
 
 

   } 
 
 
 
 
  
 
 

   标准的初始化方法 
 
 
 

   - (id)initWithAge:(int)age { 
 
 
 

        if ( self = [super init] ) { 
 
 
 

            _age = age; 
 
 
 

    } 
 
 
 

    return self; 
 
 
 

    }



然后创建对象:


Student *stu = [Student alloc] initWithAge:22]; 
 
 
 

   stu.name = @"dingxiaowei"; 
 
 
 

   NSLog(@"%@",stu); 
 
 
 

   [stu release];


@class Student 在子类中申明Student是一个类,就不需要写@import "Student.h",因为那样会降低性能,import相当于把所有的头文件都拷贝过去了,在.m文件中写@import "Student.h",因为.m文件中真正要使用Student的那些方法。



@class有些功能 @import是做不到的  当两个类相互包含的时候,相互@import的时候就会出错,但@class相互包含就不会报错,只是什么这是一个类,如果有上百个类都要引用Student这个类,那么用@import的话,只要Student类中有一点点改变,这些都要重新编译,所以还是用@class比较好



category能够动态给某个类动态的拓展方法,但不能添加属性



用category创建的分类,@interface Student(Test),类名后面如果有括号代表分类名称,如果后面有冒号,则代表继承,分类也要import导入要拓展的.h文件,但不能用@class,因为要对那个累拓展方法,所以要@import复制出有哪些方法,才能防止申明重复的同名方法


alloc new copy 是深拷贝,retain是浅拷贝
autorelease不是立即释放,是等到程序结束的时候将每个对象释放一次

标签:注意事项,OC,笔记,stu,book,Student,import,release,retain
From: https://blog.51cto.com/dingxiaowei/6457697

相关文章

  • npm install 报错如何解决npm ERR! code 128 npm ERR! An unknown git error occurre
    npmERR!code128npmERR!Anunknowngiterroroccurre如何解决 1.发现问题我在通过git工具clonevue-element-admin之后,需要下载相关的第三方包所以我就在对应目录下执行npminstall开始下载文件在安装依赖包node_models开始报错无法安装npmERR!code128npmER......
  • linux学习笔记:网路诊断工具-mtr命令
    网络诊断工具-mtr命令最近在面试的过程中,被问到了mtr命令,一脸懵逼,据面试官了解,该命令在公司里是经常使用的,借此我也来学习一下!网络诊断的背景网络诊断工具包括ping,traceroute和mtr,它们使用Internet控制消息协议(ICMP)数据包来测试Internet上两点之间的连接和传输。当用户在Intern......
  • 2013-7-12学习笔记
    形参改变影响实参主要应用在以下几个方面:1.用于外部函数要交换主函数中的两个值,可以用指针来实现,但通过指针来实现主函数中两个数的交换必须要知道,哪些类型属于值传递,哪些类型属于地址传递,对于值传递的那些类型(例如:整形、字符型)才有必要用指针来实现,因为数组,字符串属于地址传递类......
  • phonegap3.1.0自学笔记01_命令行界面(CLI)简单使用
    要使用phonegap的CLI必须首先安装好phonegap,phonegap的安装还请参看我的另外一篇文章:windows7搭建phonegap3Android开发环境。本篇文章介绍CLI的简单使用,由于本人水平有限,还请大侠不要拍砖。 phonegap3.1.0使用命令行去创建应用程序的框架,然后我们可以基于命令行创建的程序再去进......
  • [c/c++/OC]高质量的面试题及答案及注解
    一、选择题C语言:1.声明语句为inta[3][4];下列表达式中与数组元素a[2][1]等价的是(A)。A、*(a[2]+1)B、a[9]C、*(a[1]+2)D、*(*(a+2))+1a[2]<==>*(a+2)是等价的C两个数反过来了,D、1放进去2.请问经过表达式a=5?0:1的运算,变量a的最终值是(C......
  • cocos2d学习笔录1
    CCDirector的主要作用:1.访问和改变场景;2.访问cocos2d-x的配置细节3.访问视图(OPENGL,UIVIEW,UIWINDOW);4.暂停,恢复和结束游戏;5.在UIKit和OpenGL之间切换坐标CCNode常用API:1.生成一个新的节点:CCNode*childNoe=CCNode::create();2.将新节点添加为子节点......
  • 计组复习笔记
    老师说的整体要注意的...做题看清选对错课程知识点多,难点不一定在后边,可能开头就挺难。考试的时候经常说废话:比如主存的扩展,既告诉地址,还告诉总线的位数,总线的位数就是废话,实际的地址没那么多,要分清用不到的信息不知道的知识点跳过去。对缩写要知道,不要求每个字都对,要知道是......
  • 【已解决】MySQL连接错误 ERROR 1129 (00000): Host ” is blocked because of many c
     问题连接MySQL 报错 ERROR1129(00000):Host”isblockedbecauseofmanyconnectionerrors原因同一个IP在短时间内产生太多终端的数据库连接(超过mysql数据库max_connection_errors设置),导致被阻塞。在系统变量:max_connect_errors设置了允许中断的次数,超过了这个次数(或者......
  • 在Windows上无docker直接将基于Solon的jar包通过IDEA部署到Linux的docker上
    为何会选择学习solon?springboot对于我开发小企业应用太重,启动太慢,下班太晚!为何都用windows,还想着不安装dockerdesktop洁癖,运行路径能短就短。步骤(以solon官网的helloword为例)1、下载helloworld代码传送阵:点击我2、通过IDEA打开代码,并运行它(我是下载基于maven版本的)。3......
  • 10、Docker利用数据卷实现容器数据持久化与数据卷容器
    Docker利用数据卷实现容器数据持久化docker容器的分层容器的数据分层目录LowerDir:image镜像层,即镜像本身,只读UpperDir:容器的上层,可读写,容器变化的数据存放在此处,创建好容器,修改了数据,新生的的修改数据放在此处MergedDir:容器的文件系统,使用UnionFS(联合文件系统)......