您的位置:首页 > 职场人生

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

2014-10-19 22:05 477 查看

------- 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哪些框架需要链接)
也就是说, 如果分类中有重名的方法, 会相互覆盖, 也会覆盖掉主类中同名的方法. 分类中不建议写同名的方法.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: