核心语法

来源:互联网 发布:城满财富 理财知 编辑:程序博客网 时间:2024/06/06 04:03


点语法

点语法其实很类似c语言中的结构体中的点语法,但是又有区别,在oc中点语法的本质还是方法调用。下面通过一个例子来演示点语法的使用。

示例:

#import<Foundation/Foundation.h>@interface Person :NSObject{    int _age;}- (void)setAge:(int)age;- (int)age;@end@implementation Person- (void)setAge:(int)age{    _age = age;    }- (int)age{    return _age;}@endint main(){    Person *p = [Person new];    p.age = 20;//点语法,相当于[Person setAge:20].    int a =  p.age;//相当于[<span style="font-family: Arial, Helvetica, sans-serif;">Person age</span>]    NSLog(@"age is %d",a);    return 0;}

运行结果为:


上面分别在29和30行使用了点语法,但是在表象上看两个一样的代码实现了不一样的功能,第一个p.age实现了set方法的功能对成员变量就行了赋值,第二个p.age实现了get方法,返回了成员变量的值。但是我们怎么区分点语法到底什么时候实现了什么方法呢?其实这个是由xcode自动识别的,如果后面有赋值的语句会自动判断为set方法,否则则为get方法。

成员变量的作用域

在以前的学习中我们知道,如果在对象中访问成员变量,一般需要使用对成员变量增加@public属性,这样才能访问,其实还有好几类似的变量。如:

(1)@public : 在任何地方都能直接访问对象的成员变量

(2)@private : 只能在当前类的对象方法中直接访问(@implementation中默认是@private)

(3)@protected : 可以在当前类及其子类的对象方法中直接访问  (@interface中默认就是@protected)

(4)@package : 只要处在同一个框架中,就能直接访问对象的成员变量

小练习:

#import<Foundation/Foundation.h>@interface Person :NSObject{    @public    int _age;    @private    double weight;    @protected    NSString *name;}- (void)setAge:(int)age;- (int)age;- (void)test;@end@implementation Person- (void)setAge:(int)age{    _age = age;    }- (int)age{        return _age;}- (void)test{    weight = 100;//私有变量,只能在当前类的对象方法中直接访问}@endint main(){    Person *p = [Person new];    p->_age =  20;//共有变量,在任何地方都能直接访问对象的成员变量        return 0;}

@implementation中默认是@private,@interface中默认就是@protected。这几种可以试着放在不同的地方编译练习,这样方便快速掌握这几个的用法。

set方法和get方法的取代——@property和@synthesize的使用

示例:

#import <Foundation/Foundation.h>@interface Person : NSObject{    int _age;    double _weight;        NSString *_name;}/*- (void)setAge:(int)age;- (int)age;- (void)setName:(NSString *)name;- (NSString *)name; */@property int age;//可以自动生成age的setter和getter声明@property double weight;//可以自动生成weight的setter和getter声明@property NSString *name;//可以自动生成name的setter和getter声明@end@implementation Person/*- (int)age{        return _age;}- (void)test{    weight = 100;//私有变量,只能在当前类的对象方法中直接访问}- (void)setName:(NSString *)name{    _name = name;    }- (NSString *)name{    return _name;} *///@synthesize自动生成age的setter和getter实现,并且会访问_age这个成员变量@synthesize age = _age;@synthesize weight = _weight;@synthesize name = _name;@endint main(){    Person *p = [Person new];    p.age = 10;    int a = p.age;    NSLog(@"%d",a);        return 0;}

运行结果为:


通过上面的示例我们发现通过@property和@synthesize我们一样实现了set方法跟get方法。其实@property和@synthesize的本质就是生成set方法跟get方法,只是交给编译器处理了,我们看不到生成的代码而已。

ID的用法

id  == NSObject *,可以指向任何oc对象。如:id d = [Person new];这样以后就可以使用d这个id类型的对象指向任何对象。

构造方法

以前我们的学习中创建一个对象一般是调用用new方法,但是这还不是本质,完整创建一个可用对象其实需要下面两步:

1.分配存储空间  +alloc
2.初始化 -init

下面通过一个小例子来展示构造方法的使用。

示例:

#import <Foundation/Foundation.h>@interface Person : NSObject@property int age;@end@implementation Person- (id)init{    if ( self = [super init] )//调用回super的init方法:初始化父类中声明的一些成员变量和其他属性            { // 初始化成功        _age = 10;    }        // 3.返回一个已经初始化完毕的对象    return self;}@endint main(){        Person *p = [[Person alloc] init];//这种方法是整合了alloc和init。    NSLog(@"age的初始值是%d",[p age]);    return 0;}
运行结果为:


这段代码后我们就修改了以前初始话后成员变量的默认值,以前默认值是0,现在我们改成了10.if语句是进行一个判断,只用对象初始化成功,才有必要进行接下来的初始化。

这样以后我们就可以根据需要自定义一些构造方法,来满足我们的需求。

分类

如果想在不改变原来类方法的基础上为类增加一些方法,可以使用分类的形式。

使用注意:
 1.分类只能增加方法,不能增加成员变量
 2.分类方法实现中可以访问原来类中声明的成员变量
 3.分类可以重新实现原来类中的方法,但是会覆盖掉原来的方法,会导致原来的方法没法再使用
 4.方法调用的优先级:分类(最后参与编译的分类优先) --> 原来类  --> 父类



0 0
原创粉丝点击