黑马程序员——OC基础——@property、@synthesize和id类型

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

一,@property 关键字

@property关键字可以自动生成某个成员变量的setter方法和getter方法的声明和实现

语法格式为:@property (参数1,参数2)类型 名字;

@property int age;

编译器会自动扩展成下面两句:

- (void)setAge:(int)age;

- (void)age;

例如:

@property(nonatomic,retain) UIWindow *window;
其中参数主要分为三类:

1,读写属性:readwrite:产生setter、getter方法

   readonly:只产生简单的getter,没有setter

2,setter语义:assign:默认类型,setter方法直接赋值,而不进行retain操作

       retain:setter方法对参数进行release旧值,再retain新值

     copy:setter方法进行copy操作,与retain一样

3,原子性:atomicity:多线程

      nonatomic:禁止多线程,变量保护,提高性能

二,@synthesize 关键字

@synthesize关键字帮助生成成员变量的setter和getter方法的实现

语法:@synthesize age = _age;

相当于下面的代码:

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

三,关键字的使用和注意点

类的声明部分:

#import <Foundation/Foundation.h>
@interface Person : NSObject
//使用@property关键字实现_age成员变量的setter和getter方法的声明
@property int age;
@end
类的实现部分:
#import "Person.h"
@implementation Person

//使用@synthesize关键字实现_age成员变量的setter和getter方法的实现
@synthesize age = _age;
//左边的age代表要把@property int age实现
//右边的_age代表着访问_age这个成员变量
@end
程序测试:
#import <Foundation/Foundation.h>
#import "Person"
int main( int argc, const char * argv[])
{
    Person *p = [Person new];
    [p setAge:10];
    //使用点语法,打印成员变量的值
    //点语法的本质是调用setter和getter方法
     NSLog(@"age = %d",p.age);
     [p setAge:22];
     NSLog(@"age = %d",p.age);

    //NSLog(@"age = %d",p -> age);要求@public属性
    return 0;
}
运行结果:
age = 10
age = 20
1,@synthesize 可以不写,@property 可以同时拥有@property和@synthesize的功能

2,@property int age;这句话可以实现三个功能:

生成_age成员变量的get和set方法的声明

生成_age成员变量的set和get方法的实现

生成一个_age的成员变量

注意:这种方式生成的成员变量默认是private类型的。

可以通过在{}中加上int _age;显示的声明_age为protected的

原则:get和set方法同变量一样,如果你自己定义了,那么就是用用户定义的,如果没有就自动生成

手动实现:

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

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

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

例如:

#import <Foundation/Foundation.h>

@interface Dog :NSObject
{
    //可以省略
    int _age;
}

//使用@property关键字生成成员变量set和get方法的声明和实现
@property int age;
@end

@implementation Dog
//自定义了成员变量的返回方法

- (int)age
{
    return 20;
}
@end

int main(int argc ,const char * argv[])
{
    Dog *d = [Dog new]

    //使用点语法设置age的值
    //在这里调用set方法,因为没有所以编译器就自动生成了
    d.age = 5;
    //因为已手动写了get方法所以xcode会使用该方法
    NSLog(@"%d",d.age);
    return 0;
}
输出结果:
2014-12-12  17:30.056 03-property[1508:303] 10
四,Id类型

id是一种类型,指向任何一个继承了NSObject类的对象,所以OC中,任意一个NSObject对象都可以是一个id

注意:在id的定义中,已经包含了*号,id指针只能指向OC对象

id类型的定义

typedef struct objc object{

    class isa;

} *id;
局限性:调用一个不存在的方法,编译器会马上报错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值