A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 895928691 中级黑马   /  2015-7-21 21:32  /  1010 人查看  /  14 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

以前同事的oc学习笔记分享的学习宝典

14 个回复

倒序浏览
lloc new retain之后都必须要调用release方法 计数器要变只有这几种方法 retain release alloc new copy方法才会使计数器改变,谁想用人家对象,就对他进行retain操作,但在dealloc释放本对象的时候也释放引用的对象,先释放引用的对象,然后释放自己,
  内存管理做到"谁污染谁治理",谁调用谁retain,是销毁 也要销毁retain的对象
  当自己手动写get和set方法的时候,系统就不会帮我们生成synthesize,就不会自动产生下划线对象,所以在手动写get和set方法的时候如果用到下划线字段就会报错
  excu_bad_access就是野指针错误,访问了一个不属于你的内存空间
  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 = [NSMutableStringstringWithString:@"mmmmmm"];
  NSString*str2 = [str1copy];//拷贝一份出来,如果不用copy的话,后面对str1进行修改,那么也会影响str2的赋值
  [str1appendString:@"asdf"];
  [str1release];
  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];
  }
  标准的初始化方法
  - (void)initWithAge:(int)age {
  if ( self = [super init]
  ) {
  _age = age;
  }
  return self;
  }
  然后创建对象:
  Student *stu = [Student alloc]
  initWithAge:22];
  stu.name = @"dingxiaowei";
  NSLog(@"%@",stu);
  [stu release];
回复 使用道具 举报
一定要坚持签到!!!
回复 使用道具 举报
加油 加油!!:)
回复 使用道具 举报
学习了 0。0
回复 使用道具 举报
收下了,谢谢。
回复 使用道具 举报
赞一个~~~~~~
回复 使用道具 举报
蓝蓝 中级黑马 2015-7-22 01:09:26
9#
学习中..........
回复 使用道具 举报
现在还没学到
回复 使用道具 举报
刚开始学,先收藏下~
回复 使用道具 举报
有无相生 来自手机 中级黑马 2015-7-22 10:08:01
12#
好少啊。,,,,,,
回复 使用道具 举报
很多错 真是学习了
回复 使用道具 举报
还不错。
回复 使用道具 举报
收藏一下  以后会用到的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马