博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OC学习笔记[注意事项]
阅读量:7021 次
发布时间:2019-06-28

本文共 2718 字,大约阅读时间需要 9 分钟。

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不是立即释放,是等到程序结束的时候将每个对象释放一次
本文转自蓬莱仙羽51CTO博客,原文链接:http://blog.51cto.com/dingxiaowei/1366497
,如需转载请自行联系原作者
你可能感兴趣的文章
Cocos2d-x3.2 Sprite精灵类的创建与设置
查看>>
Starting MySQL.Manager of pid-file quit without updating file.[FAILED]
查看>>
phalapi-进阶篇7(使用缓存以及用redis拓展解决实际问题)
查看>>
深入浅出PostgreSQL B-Tree索引结构
查看>>
读代码整洁之道
查看>>
Git@OSC代码托管(含Git教程!important非命令行)
查看>>
PostgreSQL 如何高效解决 按任意字段分词检索的问题 - case 1
查看>>
从零开始学_JavaScript_系列(18)——dojo(7)(dojo中类的继承)
查看>>
图像处理------基于像素的皮肤检测技术
查看>>
Java8 Foreach操作
查看>>
【原创】日志输出到串口设备导致的问题
查看>>
Weblogic BEA-141281 unable to get file lock, will retry 故障处理
查看>>
Dos和Linux常用命令对比
查看>>
iOS开发实用技巧—项目新特性页面的处理
查看>>
activiti自定义流程之Spring整合activiti-modeler5.16实例(三):流程模型列表展示
查看>>
[翻译] ABCIntroView
查看>>
数据的存储介质-固态存储SSD
查看>>
用以替换系统NSLog的YouXianMingLog
查看>>
JVM实用参数(八)GC日志
查看>>
设计模式学习起点 UML类图笔记
查看>>