传智播客IOS 4期学习总结

本文详细介绍了Objective-C的基础语法,包括点语法、getter和setter的自动实现、属性声明与合成,以及类目(Category)的使用。同时,文章深入探讨了内存管理,包括栈内存和堆内存的区别、引用计数、autorelease、retain、release和dealloc方法的使用,以及内存管理的原则。此外,还讲解了block和协议(Protocal)的概念,以及Foundation框架中的常用数据结构如NSRange、NSPoint等。
摘要由CSDN通过智能技术生成

1、OC基础语法

点语法,对应着getter和setter方法。例如 car.speed = 5; 实际上是 car -> setSpeed(5)  而 NSLog(@"%d",car.speed);实际上是要通过 car -> getSpeed() 来打印

在.m文件的implementation中也可以定义变量,但是这个变量是私有的。因为.m文件不可能被任何文件所包含,不可能被任何文件所用,只是他自己用变量,所以是私有的。

我都忘了oc里面的getter和setter方法的自动实现了:举例,有一个变量 int _age;  则 .h文件中 用 @property int age; 表示setter和getter方法的声明。.m文件中 用 @synthesize age = _age;来表示getter和setter方法的实现

相同类型的变量,可以连起来写,比如 @property int age,score;  @synthesize age=_age,score=_score;

更省略的写法:如果只写 @property int age; 和 @synthesize age = _age; 而不在.h文件中写 int _age;的声明,那么在.m文件中会自动生成 _age 的定义,而因为是在.m文件中默认生成的,所以这个 _age变量是私有的,而不是像.h文件中定义的是protected的。如果@synthesize再省一些,写成@synthesize age;那么其实就默认为这样:@synthesize age = age;自动生成一个private的age变量。

在xcode4.4以上,还有更简的写法就是 @property int age; 只写这一行就OK了,其他的变量声明 和 @synthesize实现都由xcode自动实现 

id表示万能指针,可以指向和操作任何OC对象。可以认为id 于 NSObject * 等同。所以id 后面的变量就不要再加*了。

Person * p = [Person new];其实这个new方法是两个方法的合体,他的运行过程分别是1、首先调用类方法 alloc 分配存储空间, Person *p1 = [Person alloc];即返回一个分配好内存空间的Person对象,但是里面的值还没有初始化;然后2、再调用类方法init初始化对象 即 Person *p2 = [p1 init]; 这个init方法就是构造方法。把这两个一合,所以实际上等同于 Person *p =[[Person alloc] init]。之所以实际运用中不采用new 方法,是因为他太死板,只是这两个方法的合体。而实际中,我们可能需要不同的初始化构造方法。

重写构造方法init的步骤                                                                                   
-(id)init{  self = [super init];       //   1、初始化父类中声明的一些成员变量和方法  返回当前这个对象 
if(self!=nil){  /// 自定义代码  }  //   2、如果初始化对象成功,才有必要进行接下来的初始哈。判断返回的对象是否成功 nil 其实也就是0   
return self;    }                         //  3、返回一个已经初始化完毕的对象。 

如果Person类有自定义构造方法 -(id)initWithName:(NSString *) name;  Student类继承Person类,那么如果其需要扩充自定义方法,则如下                                                                            -(id)initWithName:(NSString *) name andAge:(int) age{ if(self = [super initWithName:"zhangshan"]){   custom code   } return self;}

Category类目 中 1、不能扩充属性,但是可以用原来的属性 2、如果有和父类相同的方法,则覆盖父类方法。3、如果两个类目中扩充了相同名字的方法,则在调用的时候,看编译顺序,后编译的是执行结果。编译顺序在Xcode的Build Pharse中的Compile Sources中可以找到和调整。主程序调用方法的顺序是先在类目中找,然后再到原类中找,最后到父类中找。

类本身也是内存中的一个对象,是Class类型的对象 Class c = [Person class]; 这是调取了Person类在内存中的类对象,注意Class中已经包含了*了。若有两个Person对象 p1 p2 则 [p1 class] 和 [p2 class]返回值都一样,都是Person类在内存中的类对象,地址一样。

当程序启动的时候,就会加载一次项目中所有的类(包括类目)。类加载完毕后就会调用类方法 +load方法。也就是说,不管你程序中用不用某个类,只要程序启动,就会在加载类完毕后调用所有类的 +load方法。+initialize方法是类在第一次使用的时候才调用的。注意是第一次使用!以上两个方法的调用顺序都是先调用父类的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值