@property和@synthesize
博客专区 > 海锋 的博客 > 博客详情
@property和@synthesize
海锋 发表于9个月前
@property和@synthesize
  • 发表于 9个月前
  • 阅读 1
  • 收藏 0
  • 点赞 0
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

在最初我们创建一个OC中的对象例如Student

在Student.h中

#import <Foundation/Foundation.h>

@interface Student : NSObject
{
    int _age;
    NSString *_name;
}

@end

当我们在外部使用Student这个类常见一个对象,访问内部的成员变量如下:

Student *stu = [[Student alloc] init];
    
    stu->_age = 12;
    stu->_name = @"jake";

上面访问一个对象的成员属性用->方式访问,因为类本身就是C语言的结构体。但是访问之后发现会报错。因为默认的成员变量是私有的,为了保证外界可以访问对象的成员变量。我们需要在成员变量前加上修饰符 加了修饰符的Student.h文件

#import <Foundation/Foundation.h>

@interface Student : NSObject
{
    @public
    int _age;
    @public
    NSString *_name;
}
@end

修改为public之后,也就是外界可以对Student对象的成员变量随意赋值,这样明显是不安全的,我们需要在内部对外界的赋值进行过滤,这就用到了封装的思想,我们不能用@public修饰我们成员变量。应给提供getter跟setter方法。我们在setter方法尽心拦截。

添加setter跟getter方法后的 Student.h

#import <Foundation/Foundation.h>

@interface Student : NSObject
{
    
    int _age;
    
    NSString *_name;
}

- (void)setAge:(int)age;
- (int)age;

- (void)setName:(NSString *)name;
- (NSString *)name;

@end

Student.m

#import "Student.h"

@implementation Student


 - (void)setAge:(int)age
 {
     _age = age;
 }

 - (int)age
 {
     return _age;
 }

 - (void)setName:(NSString *)name
 {
     _name = name;
 }

 - (NSString *)name
 {
     return  _name;
 }

@end

我们在外界就可以通过调用Setter方法设置值 getter方法取值

Student *stu = [[Student alloc] init];
    
    [stu setAge:12];
    [stu setName:@"jake"];

一旦我们提供了成员属性的setter跟getter方法,我们就可以使用编译器特性的点语法访问成员变量。

点语法注意两点

1.点语法不是什么牛逼的技术,只是编译器的特性。在编译阶段将点语法转换成调用setter跟getter方法

2.它的本质是调用setter跟getter方法,所有者写方法一定得实现。

    Student *stu = [[Student alloc] init];
    
    stu.name = @"jake";
    stu.age = 12;

@property关键字

由于一个类可能会有很多的成员属性每次都要写getter跟setter方法,非常麻烦,于是苹果给出一个特殊字符,@property,可以帮我们生成成员方法的getter和setter声明。 利用@property后的Student.h

#import <Foundation/Foundation.h>

@interface Student : NSObject
{
    
    int _age;
    
    NSString *_name;
}

@property int age;
//- (void)setAge:(int)age;
//- (int)age;


@property NSString *name;

//- (void)setName:(NSString *)name;
//- (NSString *)name;
@end

@property 也是编译器的特性。那么它是怎么生成getter跟setter声明的呢?拿@properry int age;为例

  • 一看要生成是setter方法,那么就该是对象方法没有返回值,@properry int age后面的age首字母大写,参数类型为@properry int age的int类型,参数名称为@properry int age的age,于是就生成了 -(void)setAge:(int)age;的setter方法。

同时注意,这里也是编译器的特性

@synthesize关键字

在getter跟setter的实现上,苹果设计出@synthesize关键字。帮助我们实现getter跟setter的实现。 使用@property后的

#import "Student.h"

@implementation Student

@synthesize age;
// - (void)setAge:(int)age
// {

// }
//
// - (int)age
// {

// }

@synthesize name;
// - (void)setName:(NSString *)name
// {

// }
//
// - (NSString *)name
// {

// }

@end

@ synthesize+要实现哪个propery的实现,在Student类中.h文件中我们有@property int age跟@property NSString *name;那么在.m文件中。我们就应该实现name跟age的setter跟getter的实现,上面的没有指明外界赋值给哪个成员变量,只是一个方法的实现空壳。如果没指名赋值的成员变量,那么默认赋值给跟@synthesize后面相同名称的成员变量。对于上面的@sysnthesize的使用,外界赋值的时候则赋值给成员变量name跟age而不是_age跟_name.

如果想让外界赋值给_age 跟 _name就得在@synthize后面制定赋值的成员变量名称

#import "Student.h"

@implementation Student

@synthesize age = _age;
// - (void)setAge:(int)age
// {
//     _age = age;
// }
//
// - (int)age
// {
//     return _age;
// }

@synthesize name = _name;
// - (void)setName:(NSString *)name
// {
//     _name = name;
// }
//
// - (NSString *)name
// {
//     return  _name;
// }

@end

在Xcode4.4以后我们就不需要写@synthesize,苹果对@property做了增强,包含了@synthesize的功能,所以我们只需要在.h文件写上@property关键字,就可以了。最终的写法

Student.h

#import <Foundation/Foundation.h>

@interface Student : NSObject
{
    
    int _age;
    
    NSString *_name;
}

@property int age;

@property NSString *name;


@end

Student.m

#import "Student.h"

@implementation Student


@end

其实上面并不是最简的写法,如果我们在Student.h不写_age跟_name成员属性,只是用@property关键字,苹果会自动帮我们生成带下划线的成员变量。

因此 Student.h可以写成

#import <Foundation/Foundation.h>

@interface Student : NSObject

@property int age;

@property NSString *name;

@end

那么这就是开发中常用的写法。

@property注意点;

1.propety只是帮我们生成了最简单的setter方法,如果我们需要过滤外界的赋值,需要重写setter方法 2.当我们重写了setter跟getter方法。编译器不会帮我们生成带下划线的成员变量了。

共有 人打赏支持
粉丝 1
博文 21
码字总数 25279
×
海锋
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: