核心语法


点语法

点语法其实很类似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;
}



@end
int 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;//私有变量,只能在当前类的对象方法中直接访问
}

@end
int 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;


@end
int 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;
}

@end
int main()
{
    
    Person *p = [[Person alloc] init];//这种方法是整合了alloc和init。
    NSLog(@"age的初始值是%d",[p age]);
    return 0;
}
运行结果为:


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

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

分类

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

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



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值