黑马程序员——入学Blog07----@property

-----------android培训java培训iOS培训.Net培训、期待与您交流!------------  
          OC成员变量的getter和setter方法大同小异,使用@property关键字可以不用手工写那些代码,节省了程序员的时间
//  main.m

#import <Foundation/Foundation.h>
#import "Dog.h"
int main(int argc, const char * argv[])
{

    @autoreleasepool {
        Dog *d = [[Dog alloc] init];
        [d setColor:1];
        NSLog(@"Dog对象的color = %d",[d color]);<span style="white-space:pre">												</span>NSLog(@"断点");
    }
    return 0;
}

//
//  Dog.h

#import <Foundation/Foundation.h>

@interface Dog : NSObject
@property int color;   // 毛发的颜色
@end

//
//  Dog.m

#import "Dog.h"

@implementation Dog

@end
断点处的运行结果:

    分析:Dog.m中什么都没有写,但是从运行结果可以看出Dog对象d已经有一个成员变量_color,而且可以调用setColor设置_color的值,调用color方法可以返回_color的值。

    @property除了可以帮助生成getter和setter方法外,还有其他的作用。这些作用主要体现在它的参数上。property的参数可以分为4个方面的功能。

    1.set方法内存管理相关的参数

       不使用ARC的情况下:

         retain : release旧值,retain新值(适用于OC对象类型)

         assign : 直接赋值(默认,适用于非OC对象类型)

         copy   : release旧值,copy新值

      使用ARC的情况下

         strong 和 weak:都适用于OC对象类型,一般使用strong         

         assign : 直接赋值(默认,适用于非OC对象类型)

         copy   : release旧值,copy新值

     2.是否要生成setter
       readwrite:同时生成setter和getter
       readonly:只生成getter方法
     3.多线程管理
       nonatomic:性能高(一般就用这个)
       atomic:性能低(默认)
     4.setter和getter方法的名称
       setter:决定了set方法的名称
       getter:决定了getter方法的名称
//  main.m

#import <Foundation/Foundation.h>
#import "Dog.h"
#import "Person.h"
#import "Car.h"
#import "House.h"
int main(int argc, const char * argv[])
{

    @autoreleasepool {
        Person *p = [[Person alloc] initWithIdCard:@"33331231245948250"];
        Car *c = [[Car alloc] init];
        House *h = [[House alloc] init];
        [p setBigHouse:h]; // < 1 >
        // [p setIdCard]; < 2 >
        [p setCar:c];
        NSLog(@"p对象的身份证号码为:%@,拥有的汽车为%@,拥有的房子为%@",[p idCard],[p car],[p bigHouse]);
        NSLog(@"断点");
    }
    return 0;
}

//
//  Car.h

#import <Foundation/Foundation.h>

@interface Car : NSObject

@end

//
//  Car.m

#import "Car.h"

@implementation Car

@end

//
//  House.h

#import <Foundation/Foundation.h>

@interface House : NSObject

@end

//
//  House.m

#import "House.h"

@implementation House

@end

//
//  Person.h


#import <Foundation/Foundation.h>
@class Car,House;
@interface Person : NSObject

@property (nonatomic,strong,readonly) NSString *idCard;  // 身份证号码为只读

@property (nonatomic,strong) Car *car;     // 汽车

@property (nonatomic,strong,setter = setBigHouse:,getter = bigHouse) House *house; // 房子 修改getter和setter方法,set方法注意冒号

// 自定义构造函数使用身份证号码初始化对象
-(Person *) initWithIdCard:(NSString *)idCard;
@end

//
//  Person.m

#import "Person.h"

@implementation Person


// 自定义构造函数使用身份证号码初始化对象
-(Person *) initWithIdCard:(NSString *)idCard
{
    if (self = [super init])
    {
        self->_idCard = idCard;
    }
    return self;
}

@end
运行结果:

        分析:House对象的getter和setter方法名确实已经被修改了,而[p setIdCard]方法报没有找到的错误,证明readonly参数起作用了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值