黑马程序员——OC语言——@property和@synthesize使用

本文探讨了Objective-C与Swift两种编程语言在iOS开发领域的应用与区别,介绍了如何利用它们创建高效的iOS应用程序。

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、传统的get和set方法

定义一个Student类,拥有一个成员变量age和对应的getset方法。

在OC中为了保护数据的安全和编程,OC中对实例变量进行初始化和实例变量运用都采用了对象方法对其实现。OC中把这两种方法称作setter和getter,seter方法就是对实例变量进行初始化或者赋值,getter方法就是对实例变量进行访问。有了这两个方法后,OC中的主程序需要对实例变量赋值或者访问时就可以直接调用这个方法。 

</pre><pre name="code" class="objc">//Student类:
@interface Student : NSObject {

int _age;

}

- (void)setAge:(int)newAge;//setter方法
- (int)age;//getter方法
@end

//Student类实现:
@implementation Student 
//setter方法实现
- (void)setAge:(int)newAge{
_age = newAge; 
}
//getter方法
- (int)age{
return _age; 
}
@end
//调用:
Student *stu = [[Studentalloc] init];
// 设置age的值
[stusetAge:10];

//取出age的值
int age = [stu age]; 
NSLog(@"age is %i", age);


二、点语法

(一)点语法的使用

OC中对对象方法进行访问时的程序块是相对繁琐的,为了解决这一问题OC中引进了点语法来简化这一步骤。它是xcode的特性。

#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person * p  = [Person new ];
//        传统方法
        [p setName:@"张三丰"];
        [p setAge:17];
//        点语法
//              编译器的特性   帮我们做代码替换
//        对象.属性名    注意此时p.age 并不是直接访问实例变量
//        而是xcode 看到点语法p.age后  会帮我们自动替换成 [p setAge:18]
        p.age = 18;
        p.name = @"凤姐";
//        注意 此处p.age是出现自等号的右侧
//        实际上Xcode在 看到p.age 出现在等号右侧后  自动替换成 [p age];
        int a = p.age;
        NSString *s = p.name;
//        p.age到底替换成哪个  一般取决于 设置值 还是 取值
        NSLog(@"姓名: %@ 年龄: %d ",s,a);
    }
    return 0;
}


    注意:

        (1)把原来的[stusetAge:10]替换成了stu.age = 10。这两种写法是完全等价的。即这里的stu.age并不是代表直接访问stu对象的成员变量age,而是编译器遇到stu.age = 10的时候会自动将代码展开成[stu setAge:10]。

        (2)把原来的int age =[stu age]替换成了int age = stu.age。这两种写法又是完全等价的, stu.age并不是直接访问stu对象的成员变量age,而是编译器遇到int age = stu.age的时候会自动将代码展开成int age = [stu age]。

        (3)OC点语法的本质是方法调用,不是直接访问成员变量。至于这个点语法代表的是get方法还是 set方法,那就取决于你是取值还是设值(也可以理解为点语法是在“=”的左侧还是右侧,: stu.age=.... 这就是调用set方法,右侧 ... = stu.age这就是调用get方法),取值就是get方法,设值就是set方法。 

三、@property关键字介绍及使用

(一)@property的基本概念

@property是编译器的指令,编译器指令就是用来告诉编译器要做什么,
@property告诉编译器声明属性的访问器(getter/setter)方法。这样的好处是:免去我们手工书写get和set方法繁琐的代码。

(二)@property的用法

                @property 类型方法名

如:@property int age; 相当于进行了age的set和get方法的声明

   -(void)setAge:(int)age;

    -(int)age;

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
    int _age;
    NSString *_name;

}
//-(void)setName:(NSString* )name;
//-(void)setAge:(int)age;
//-(NSString*)name;
//-(int)age;
@property int age;
@property NSString *name;
@end


四、@synthesize关键字介绍和使用

(一)@synthesize的概念

@synthesize是在m文件中定义set和get方法的实现。

(二)@synthesize用法

1)@property int age; @synthesize age;  表示生成.h中变量age的get和set方法

#import "Person.h"

@implementation Person
//使用前
//-(void)setName:(NSString* )name{
//    _name = name;
//}
//-(void)setAge:(int)age{
//    _age = age;
//}
//-(NSString*)name{
//    return _name;
//}
//-(int)age{
//    return _age;
//}
//使用后
@synthesize age;
@synthesize name;
@end


 注意:

        (1)错误用法,只写了@synthesize,没有写@property ,也没有定义变量NSString *name; 

        (2) @property类型xxx如果类中没有xxx这个实例变量,则会自动生成一个。

    正确用法:  

         
先定义变量int age; 

        使用@propertyage;声明方法

        使用@synthesize age;实现方法

(三)@synthesize指定实例变量赋值

1)@property int a;

@synthesize a = _b;

表示用a的get和set方法,修改属性b的值

相当于下面的代码:


-(void)setA:(int)a {
_b=a; 
}
- (int)a {
return _b; 
}

五、@property增强使用

xcode4.4以后,property做了增强 帮助我们自动生成get/set方法的声明

如果没有手动声明成员变量,perperty会在.m文件中自动帮我们生成一个_开头的成员变量

注意点:如果想让子类继承父类的成员变量,还是必须在.h中手动写成员变量

.h文件中


@property int score;

.m文件中

首先生成一个_score的变量 (注意该变量是私有的)

-(void)setScore:(int) score{
        _score =score;
}
-(int)score{
return _score;
}

举例如下:

person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject

//xcode4.4之后  可以只使用@property 而不使用 @synthesize
//声明和实现了 _age _name的 set 和 get 方法
//操作的是带有下划线的实例变量
//如果我们当前类,没有下划线的实例变量  则系统会帮我们生成
@property int age;        //生成一个int _age
@property NSString* name;
-(void)test;
@end

person.m

#import "Person.h"

@implementation Person
-(void)test{
    NSLog(@"_age = %d,_name = %@",_age,_name);
}
@end

main.m

#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person * p =  [Person new];
        p.age = 18;
        p.name = @"班长";
        [p test];
        
    }
    return 0;
}


六、@property下重写get和set方法

手动实现:

(1)如果手动实现了set方法,那么编译器就只生成get方法和成员变量;

(2)如果手动实现了get方法,那么编译器就只生成set方法和成员变量; 

(3)如果set和get方法都是手动实现的,那么编译器将不会生成成员变量,并且报错。

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值