OC属性和变量

刚开始接触OC属性和变量的时候,真的把它们搞混了,不单是我,和我一块学习的也把它没有搞清楚,这不花了一些时间整理了属性和变量的区别。当然这只是个人的看法,有错之处 还请不吝指正。
下面以例子来解释:

例1:

//val.h头文件
//  Created by tsc on 15-11-1.
//  Copyright (c) 2015年 tsc. All rights reserved.

#import <Foundation/Foundation.h>

@interface Val : NSObject
{
    int value; //只有一个变量,而没有setter和getter方法
}
-(void) print; //负责打印变量的值
@end
//val.m实现文件
#import "val.h"

@implementation Val
-(void) print
{
    value = 3;
    NSLog(@"%d",value);
}
#import <Foundation/Foundation.h>
#import "val.h" //引用头文件
int main(int argc, const char * argv[])
{
    @autoreleasepool {
        Val *v = [Val new]; 
        [v print]; //打印value的值
    }
    return 0;
}

在没有写setter和getter方法时使用如图:
这里写图片描述
这里我们看到val 类只一个变量,而且它不能使用settert 和getter方法
例2:

//main.m
#import <Foundation/Foundation.h>
#import "val.h"
int main(int argc, const char * argv[])
{
    @autoreleasepool {
        Val *v = [Val new];
        [v setValue:5];
        NSLog(@"rec = %d",[v value]);
    }
    return 0;
}


//  val.h
#import <Foundation/Foundation.h>

@interface Val : NSObject
{
    int value;
}
-(void) print;
-(void) setValue:(int)d;
-(int) value;
 @end

//  val.m
#import "val.h"

@implementation Val
-(void) print
{
    value = 3;
    NSLog(@"%d",value);
}
-(void) setValue:(int)d
{
    value = d;
}
-(int) value
{
    return  value;
}
@end

上面是使用了手动合成的setter和getter方法
运行结果如下图:
这里写图片描述
v.value 中的 . 它调用的是方法,在=号左边调用设置方法,在=号右边调用取值方法。
可以看到它可以正常运行,记住变量仅仅是一个变量(下面看例3)
例3:

//  main.m
#import <Foundation/Foundation.h>
#import "val.h"
int main(int argc, const char * argv[])
{
    @autoreleasepool {
        Val *v = [Val new];

        v.value = 5;;
        int rec = v.value;
        [v print];
        NSLog(@"rec = %d",rec);
    }
    return 0;
}
//  val.h
#import <Foundation/Foundation.h>

@interface Val : NSObject
@property int value; //换成了这个部分
-(void) print;
 @end
//  val.m
#import "val.h"
@implementation Val
-(void) print
{
    _value = 3; //对比前面这里变成了这样,其实如果想继续像例2一样使用,可以看例4
    //使用value = 3;的话会报错,请看下图;
    NSLog(@"%d",_value);
}
@end

这里写图片描述
上图是使用value引起的错误,也就是说value这个名字它不再是变量。

运行结果如下图:
这里写图片描述

结果和例2的是一样的。

现在还别忙着总结,接下来看例4
例4:

//  main.m
#import <Foundation/Foundation.h>
#import "val.h"
int main(int argc, const char * argv[])
{
    @autoreleasepool {
        Val *v = [Val new];

        v.value = 5;;
        int rec = v.value;
        [v print];
        NSLog(@"rec = %d",rec);
    }
    return 0;
}
//  val.h
#import <Foundation/Foundation.h>

@interface Val : NSObject
@property int value; //换成了这个部分
-(void) print;
 @end
//  val.m
#import "val.h"
@implementation Val
@synthesize value; //比例3多加了这个部分
-(void) print
{
    NSLog(@"value = %d",value);
}
@end

例4运行结果如下图:
这里写图片描述

从上面我们可能总结出来一个问题。

@property 和@synthesize 它们帮助我们合成setter和getter 方法.而且如题 中
@property int value; 它自动为我们生成了一个变量_value,也就是说value这个名字不再是一个变量名,它只是一个属性名称。而我们在写@synthesize value时,实际上是为value 这个属性重新定义 一个变量名,也就是将 _value这个变量名换成了value 。那么 _value就不再存在了。其实@synthesize value;也可以改成你自己定义的变量如
@synthesize value = tsc;
测试结果如下图:
这里写图片描述
到些结束,有什么疑问,请联系

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

俯仰一世_1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值