黑马程序员——OC基础—核心语法(下)

------- android培训、ios培训、期待与您交流! ----------

=====点语法 =====

点语法方法的本质是方法调用。

当使用点语法时,编译器会自动展开成相应的方法。

比如:

stu.age = 10;

系统遇到上面这句语法的时候,会自动转成下面的语法。

[stu setAge:10];

int age = stu.age;

系统遇到上面这句语法的时候,会自动转成下面的语法。

int age = [stu age];

# 为什么会有点语法

1>简化代码,使编写代码简单。

2>其他很多编译器都具有点语法,Xcode为了让别的程序员能快速熟悉编译器,而推出的点语法。

#点语法使用注意

避免死循环

- (viod)setAge:(int)age
{
        //_age = age
       NSLog(@"setAge");
      self.age = age // 相当于 [self setAge:age];
}

这个会陷入死循环

- (int)age
{
       NSLog(@"age");
      return self.age; // 相当于调用了[self age];
}

这样同样会陷入死循环

=====@property =====

可以快速生成set与get方法,省去低级代码的工作量。

声明格式:

@property  类型名称 成员变量;  . . .

@property int age;

就等于

- (void)setAge:(int)age;

-(int)age;

这样可以省去我们很多时间。

当然也可以一次声明多个成员变量

@property int age;no;

这样就一次生成两个成员变量的set与get

但是一般分开写,为了代码的可读性高。

=====@snythesize =====

与@property对应,当声明好成员变量的set与get后,会自动生成与之对应的实现。

@snythesize age = _age  //会生成age的get,并且会访问_age这个成员变量

上面这行代码就等于:

-(int)age

{

        return _age;

}

简单写法:

@snythesize age ; // 默认会访问age这个成员变量,如果没有,系统会自动生成@private类型的age变量 

注意:@property语法在后面会自动生成set与get的实现,取代了@snythesize语法,而且,系统会优先选择用户自己的声明与实现,如果用户自己没有声明或者实现,系统才会自动生成。

===== 分类 Category =====

比如我们已经有一个Person类, 有它定义的方法. 我们想给Person类新加一些方法, 但是要求不能修改Person类 (Person.h和Person.m文件).

一种方法是使用继承新建一个子类, 就可以包含Person类的所有方法并添加新的方法.

另一种方法是使用分类, 不需要新建类, 也可以扩充类的方法.

分类有利于团队开发。

一个类可以有很多个分类. 每个分类都可以给它添加不同的方法.

# 分类的声明与实现

分类分为声明和实现, 分别写在.h和.m文件中. 在Xcode中新建文件, 选择OC Category, 输入分类名称(一般以模块命名, 有时也以开发者命名),选择是哪个类的分类(比如Person).

分类的声明

#import "Person.h"               // 需要引用主类, 可以调用主类的方法 (比如属性的set/get方法)
@interface Person(MJ)        // 分类用 (小括号) 表示
- (void) study;
@end

分类的实现

#import "Person+MJ.h"         // 分类文件的文件名默认为 主类名+分类名
@implementation Person(MJ)
- (void) study {
        NSLog(@"Person is studying. ");
}
@end 

分类的使用

#import <Foundation/Foundation.h>
#import "Person.h"                  // 包含主类文件
#import "Person+MJ.h"           // 包含分类文件
int main() {
        Person *p = [[Person alloc] init];
        [p study];                       // 可以对这个类的对象调用分类中的方法
        return 0;
}

注意:

1> 只能增加方法, 不能增加成员变量. 如果需要增加成员变量, 可以考虑创建子类继承.

2> 分类的实现中可以访问主类的成员变量.

3> 分类可以重写主类的方法, 但是不建议使用. 如果分类中有和原类中同名的方法, 会覆盖原类的方法, 这样会导致主类的方法无法再被调用,不建议这么做.

注: 调用方法时, 会先在分类中寻找, 如果没有, 再到原类中寻找, 如果没有, 再到父类中寻找, 如果没有, 再到头文件中寻找.

4> 如果不同的分类中有同名的方法, 和编译的顺序有关, 会调用最后编译的分类中的这个方法. 在 Build Phases - Compile Sources 中可以查看.可以看到只编译.m源文件 (.c .cpp), .h文件不会被编译, 安装从上到下的顺序编译. 可以调整文件编译的顺序. 注意就算把主类放到分类的后面编译, 依然会调用最后编译的分类中的方法.  (Link Binary with Libraries 是链接的框架, 就是命令行的 -framework XXX, 可以添加其它框架,告诉Xcode哪些框架需要链接)

也就是说, 如果类中有重名的方法, 会相互覆盖, 也会覆盖掉主类中同名的方法. 分类中不建议写同名的方法.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值