黑马程序员[email protected],@synthesize使用细节和id

一、@property@synthesize 关键字以及使用细节

这两个关键字是编译器的特性,帮助我们有效的减少不必要代码的书写。

1.@property可以自动生成某个成员变量的setter和getter方法声明

 1 #import <Foundation/Foundation.h>
 2
 3 @interface Person : NSObject
 4 {
 5     int _age;
 6     // int age;
 7      int _height;
 8      double _weight;
 9      NSString *_name;
10 }
11
12 // @property:可以自动生成某个成员变量的setter和getter声明
13 @property int age;
14 //- (void)setAge:(int)age;
15 //- (int)age;
16
17 @property int height;
18 //- (void)setHeight:(int)height;
19 //- (int)height;
20
21 - (void)test;
22
23 @property double weight;
24
25 @property NSString *name;
26
27 @end

这里注意不可以写成@property int _age;这样写的话会默认声明: - (void)setAge:(int)_age;- (int)_age; 就无法调用p.age或者[p setAge:10];只能这样调用p._age;或者[p set_age:10];

@synthesize可以自动生成某个成员变量的setter和getter方法

 1 #import "Person.h"
 2
 3 @implementation Person
 4
 5 // @synthesize自动生成age的setter和getter实现,并且会访问_age这个成员变量
 6 @synthesize age = _age;
 7
 8 @synthesize height = _height;
 9
10 @synthesize weight = _weight, name = _name;
11
12 @end

这里注意@synthesize age = _age;不可以写成@synthesize age = age;或者@synthesize age;这样写的话会自动访问age这个变量而不是_age这个成员变量(假设@interface中有声明age这个变量)

2.其实还有更简便的方法,@interface中去掉成员变量的声明。但是注意如果@interface中没有声明成员变量,那么会自动生成@private类型成员变量。如果想要成员变量为@protected类型的,方便子类访问,那么只能在@interfae中声明了。

 1 #import <Foundation/Foundation.h>
 2
 3 @interface Car : NSObject
 4 {
 5     //int _speed;
 6     //int _wheels;
 7 }
 8 @property int speed;
 9 @property int wheels;
10
11 //@property int speed, wheels;
12 - (void)test;
13 @end
 1 #import "Car.h"
 2
 3 @implementation Car
 4 //@synthesize speed = _speed, wheels = _wheels;
 5 // 会访问_speed这个成员变量,如果不存在,就会自动生成@private类型的_speed变量
 6 @synthesize speed = _speed;
 7 @synthesize wheels = _wheels;
 8
 9 - (void)test
10 {
11     NSLog(@"速度=%d", _speed);
12 }
13
14 @end

3.在Xcode4.4以后,@proterty关键字会自动声明和实现成员变量的setter和getter方法,无需@synthesize关键字

1 #import <Foundation/Foundation.h>
2
3 @interface Dog : NSObject
4 @property int age;
5 @end
1 #import "Dog.h"
2
3 @implementation Dog
4
5 @end

这里要注意几点:

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

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

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

二、id

>万能指针,能够指向任何OC对象,相当于NSObject *

>id类型的定义:

1 typedef struct objc_object
2 {
3     Class isa;
4 } *id;

>注意id后面不要加*

id p = [person new];

>局限性:调用一个不存在的方法,编译器会立马报错。

1 #import <Foundation/Foundation.h>
2
3 @interface Person : NSObject
4 @property int age;
5 @property id obj;
6 @end
1 #import "Person.h"
2
3 @implementation Person
4
5 @end
 1 #import <Foundation/Foundation.h>
 2 #import "Person.h"
 3
 4 void test(id d)
 5 {
 6
 7 }
 8
 9 int main(int argc, const char * argv[])
10 {
11
12     @autoreleasepool {
13         Person *p = [Person new];
14         NSObject *o = [Person new];
15         // id  == NSObject *
16         // 万能指针,能指向\操作任何OC对象
17         id d = [Person new];
18
19         [d setAge:10];
20         // 可以传任何对象
21         [d setObj:@"321423432"];
22
23         NSLog(@"%d", [d age]);
24     }
25     return 0;
26 }
时间: 2025-01-14 09:53:44

黑马程序员[email protected],@synthesize使用细节和id的相关文章

黑马程序员[email&#160;protected]和@synsthesize的使用

一.@property和@synthesize的基本使用 @property :可以自动生成某个成员变量的setter和getter的声明(@property int age;).写在@interface里面: @synthesize :自动生成age的setter和getter,并且在方法内部访问的是_age这个成员变量(@synthesize age = _age; // 如果后面不写=_age默认就是访问age成员变量).写在@implementation里面: 二.@property和@

黑马程序员 [email&#160;protected]和@synthesize

———Java培训.Android培训.iOS培训..Net培训.期待与您交流! ——— 1.@property 和@synthesize 的作用 (1) 通过@property可以自动生成属性的set,get方法的声明部分 生成的是set,get方法是哪个属性的,@property后面的名称就是属性去掉下划线后的部分 例如: - (void)setName: (NSString *)name; - (NSString *)name; 这两行代码可以用 @property (NSString *

黑马程序员 [email&#160;protected]增强(神器)

———Java培训.Android培训.iOS培训..Net培训.期待与您交流! ——— 1.@property 增强的介绍 1> Xcode 4.4之后,@property 独揽了 @synthesize  的功能,也就是说@property可以同时生成sette和getter的声明和实现 2>默认情况下,setter 和 getter的实现中,会去访问下划线_开头的成员变量 例如: 1 #import <Foundation/Foundation.h> 2 @interface

黑马程序员[email&#160;protected]和ARC

@property和ARC @property和ARC都是编译器特性,系统会帮我们自动生成代码 property参数 1.set方法内存管理相关的参数 retain : release旧值,retain新值(适用于OC对象类型) assign : 直接赋值(默认,适用于非OC对象类型) copy   : release旧值,copy新值 2.是否要生成set方法 readwrite : 同时生成setter和getter的声明.实现(默认) readonly  : 只会生成getter的声明.实

黑马程序员——OC语言@property、@synthesized与id

一.@property @synthesize关键字 注意:这两个关键字是编译器特性,让xcode可以自动生成getter和setter的声明和实现. (一)@property 关键字 @property 关键字可以自动生成某个成员变量的setter和getter方法的声明 @property int age; 编译时遇到这一行,则自动扩展成下面两句: - (void)setAge:(int)age; - (int)age; (二)@synthesize关键字 @synthesize关键字帮助生

黑马程序员_OC学习笔记之@property和@synthesize

[objc] view plaincopyprint? <span style="font-size:24px;">#import <Foundation/Foundation.h> @interface Person : NSObject { int _age; int age; int _height; int height; int _weight; int weight; int _money; int money; } @property int ag

黑马程序员_Objective C中的@property 与 @synthesize 快速生成setter getter方法

<a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>.<a href="http://www.itheima.com"target="blank">.Net培训</a>.期待与您交流! 一般来说在一个类中 成员变量是会有setter 跟getter方法的. 如果每一个成员变量的setter 跟gett

黑马程序员——oc语言学习心得—— 属性声明和赋值

黑马程序员——oc语言学习心得—— 属性声明和赋值 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 1,在oc中所有类继承与终极父类Object2,声明字符变量采用N是string  *_xxx 实例变量一般以下划线开头3,在oc中方法以+ -号区分 -号开头是实例方法或对象方法  +号开头是类方法  前置用对象调用 后者用类名调用4,在xcode4以后声明@property 不用在写@snysize  自动生成get.set方法5,属性

黑马程序员_spring2.5视频教程--视频列表

\黑马程序员_spring2.5视频教程\01Struts相关基础理论介绍.mp4; \黑马程序员_spring2.5视频教程\02搭建struts开发环境.mp4; \黑马程序员_spring2.5视频教程\03用struts开发简单的登陆示例程序.mp4; \黑马程序员_spring2.5视频教程\10.使用构造器装配属性.mp4; \黑马程序员_spring2.5视频教程\11Resource注解完成属性装配.mp4; \黑马程序员_spring2.5视频教程\12编码剖析@Resourc