黑马程序员技术交流社区

标题: 大神的oc学习笔记 [打印本页]

作者: 895928691    时间: 2015-7-21 21:32
标题: 大神的oc学习笔记
以前同事的oc学习笔记分享的学习宝典
作者: 895928691    时间: 2015-7-21 21:36
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;//指将指针所指向的那条线给擦掉

作者: 895928691    时间: 2015-7-21 21:37
[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];

作者: 手残程序员    时间: 2015-7-21 21:39
一定要坚持签到!!!
作者: 普通蜗牛    时间: 2015-7-21 21:42
加油 加油!!:)
作者: shorfng    时间: 2015-7-21 21:54
学习了 0。0
作者: 慕名黑马生    时间: 2015-7-22 00:29
收下了,谢谢。

作者: huguozhang    时间: 2015-7-22 00:31
赞一个~~~~~~
作者: 蓝蓝    时间: 2015-7-22 01:09
学习中..........
作者: 爱马尚    时间: 2015-7-22 06:36
现在还没学到
作者: 被水淹死的鱼    时间: 2015-7-22 09:11
刚开始学,先收藏下~
作者: 有无相生    时间: 2015-7-22 10:08
好少啊。,,,,,,
作者: 后街男孩    时间: 2015-7-22 12:24
很多错 真是学习了
作者: norwood    时间: 2015-7-22 13:13
还不错。
作者: 你说呢    时间: 2015-7-22 17:50
收藏一下  以后会用到的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2