C15_OC05-@property和@synthesize

运行XCode5.1,创建项目,OSX版,CommanLineTool。完成后,新建文件,OSX,Cocoa,ObjectC-Class。以下测试在终端使用cc命令会报警,但运行无错。

1.隐式settergetter的自动完成

1h文件

#import <Foundation/Foundation.h>

@interface Persion : NSObject
    /**使用 @property 代替以前的{}声明对象属性方式。但实质上还是这样创建的,有XCode自动隐式完成。4.x版本的XCode隐式创建时,属性名是默认带“_”的,本文5.1版本XCode默认没有下划线前缀。
    {
        int age;
        NSString * name;
    }
    **/
    @property int age;              //默认是private
    @property NSString * name;      //private
    /**使用@property创建的属性会自动创建setter和getter的声明
    - (void) setAge:(int)age;
    - (int)age;
    - (void) setName:(NSString *)name;
    - (NSString *)name;
    **/
    //------------其它方法--------------
    - (NSString *) toString;
@end

2m文件

#import "Persion.h"

@implementation Persion
    /**使用 @synthesize 自动实现setter和getter**/
    @synthesize age;    //这一句也不是必须的。只有在@interf中使用了@property即可,除非你需要改变操作的属性(成员变量)。
    @synthesize name;
    //@synthesize age, name;
    /**因为使用了 @synthesize,以下代码冥冥中自动完成了
    - (void) setAge:(int)age{
        self->age = age;
     }
     - (int)age{
        return self->age;
     }
     - (void) setName:(NSString *)name{
        self->name = name;
     }
     - (NSString *)name{
        return self->name;
     }
    **/
    //------------其它方法--------------
    - (NSString *) toString{
        return [NSString stringWithFormat:@"年龄:%d,姓名:%@", age, name];
    }
@end

3main

#import <Foundation/Foundation.h>
#import "Persion.h"

int main(int argc, const char * argv[])
{
    Persion * p = [Persion new];
    //使用.点方法访问对象的属性。这和Java、C#中的点方法绝对是两回事
    //如果是赋值,本质还是调用setter
    p.age = 43;
    p.name = @"Eminm";
    
    NSLog(@"Persion,%@", [p toString]);
    
    //使用点方法。如果是调用,本质还是getter
    NSLog(@"Persion的Name:%@", p.name);
}

2.预定义属性和隐式gettersetter

1h文件

#import <Foundation/Foundation.h>

@interface Animal : NSObject
    //如果有须要仍然这样声明了对象属性
    {
        NSString * _name;
    }
    //并且想自动声明属性的setter和getter
    //因为m文件中的@synthesize配置name=_name,这里并未隐式的声明name属性。这个name即指向了_name
    @property NSString * name;

    - (NSString *) toString;
@end

2m文件

#import "Animal.h"

@implementation Animal
    //指定操作的成员变量
    @synthesize name = _name;
    /** 隐式完成的内容:
     - (void) setName:(NSString *)name{
        _name = name;
     }
     - (NSString *)name{
        return _name;
     }
    **/

    - (NSString *) toString{
        return [NSString stringWithFormat:@"%@", _name];
    }
@end

3main

#import <Foundation/Foundation.h>
#import "Animal.h"

int main(int argc, const char * argv[])
{  
    Animal * animal = [Animal new];
    animal.name = @"Chihuahua";
    NSLog(@"Aniaml,%@", [animal toString]);
}

3.隐式的属性定义

1h文件

#import <Foundation/Foundation.h>

@interface Plant : NSObject
    @property NSString * name;
    /**
     当前Xcode版本为5.1。这一功能从4.3开始
     上一句代码做了3件事
     1.声明了成员变量_name
     2.声明了setter和getter
     3.在.m中实现了setter和getter
     所以,仅一个声明,XCode就自动完成了一系列代码实现
     **/
@end

2m文件

#import "Plant.h"

@implementation Plant
/** 这里什么也不用做 
 由XCode自动完成@synthesize name = _name;
 即完成实现_name的setter和getter
 **/
@end

3main

#import <Foundation/Foundation.h>
#import "Plant.h"

int main(int argc, const char * argv[])
{
    Plant * plant = [Plant new];
    /** 实质还是调用XCode隐式自动实现的set方法 **/
    plant.name = @"兰草";
    /** 实质还是调用XCode隐式自动实现的get方法 **/
    NSLog(@"植物:%@", plant.name);
}

4.隐式实现原则

#import <Foundation/Foundation.h>

@interface Plant : NSObject
    @property NSString * name;
@end

@implementation Plant
    /**
    XCode在编译时,有则使用,无则创建
    这里有了一个getter,那么就拿来用
    **/
    - (NSString *) name{
        return @"HelloProperty";
    }
@end

int main(int argc, const char * argv[])
{
    Plant * plant = [Plant new];
    plant.name = @"兰草";
    NSLog(@"植物:%@", plant.name);    //植物:HelloProperty
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值