OC基础--Property
编译器指令:
用来告诉编译器要做什么
@property:
@property是编译器的指令 告诉编译器在@interface中自动生成setter和getter的声明
@synthesize:
@synthesize是编译器的指令 告诉编译器在@implementation中自动生成setter和getter的实现
手动写setter-getter:
#import <Foundation/Foundation.h>
@interface Member : NSObject
{
@public
NSString * _name;
int _age;
NSString * _account;
NSString * _password;
}
- (void) setName: (NSString *) name;
- (NSString *) name;
- (void) setAge: (int) age;
- (int) age;
- (void) setAccount: (NSString *)account;
- (NSString *) account;
- (void) setPassword: (NSString *) password;
- (NSString *) password;
@end #import "Member.h"
@implementation Member
- (void) setName: (NSString *) name{
_name = name;
}
- (NSString *) name{
return _name;
}
- (void) setAge: (int) age{
_age = age;
}
- (int) age{
return _age;
}
- (void) setAccount: (NSString *)account{
_account = account;
}
- (NSString *) account{
return _account;
}
- (void) setPassword: (NSString *) password{
_password = password;
}
- (NSString *) password{
return _password;
}
@end
使用@property和@synthesize:
#import <Foundation/Foundation.h>
@interface Member : NSObject
{
@public
NSString * _name;
int _age;
NSString * _account;
NSString * _password;
}
@property NSString * name;
@property int age;
@property NSString * account;
@property NSString * password;
@end #import "Member.h"
@implementation Member
@synthesize name = _name;
@synthesize age = _age;
@synthesize account = _account;
@synthesize password = _password;
@end
@property和@synthesize说明:
@property:
编译器只要看到@property, 就知道我们要生成某一个属性的getter/setter方法的声明
/*
- (void)setAge:(int)age;
- (int)age;
*/
// 使用@property等效以上两句
@property int age;
使用@property作声明的时候 , 不需要加下划线 _
// 加上下划线后等效于以下两句
@property int _age;
/*
- (void)set_age:(int)_age;
- (int)_age;
*/
@synthesize:
在@synthesize后面告诉编译器, 需要实现哪个@property生成的声明
/*
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
return _age;
}
*/
// 使用@synthesize等效以上部分
// 如果成员变量_age不存在,就会自动生成一个私有的成员变量_age(在.m实现文件中)
@synthesize age = _age;
告诉@synthesize, 需要将传入的值赋值给谁和返回谁的值给调用者
/*
- (void)setAge:(int)age
{
_number = age;
}
- (int)age
{
return _number;
}
*/
// 如果这样写读写的是 _number 而不是 _age
@synthesize age = _number;
如果在@synthesize后面没有告诉系统将传入的值赋值给谁, 系统默认会赋值给和@synthesize后面写得名称相同的成员变量
#import <Foundation/Foundation.h> @interface Person : NSObject
{
@public
int _age;
int age;
}
@property int age;
@end #import "Person.h"
@implementation Person
@synthesize age;
@end #import <Foundation/Foundation.h>
#import "Person.h" int main(int argc, const char * argv[]) {
Person *p = [Person new];
[p setAge:];
NSLog(@"_age = %i, age = %i", p->_age, p->age);
return ;
}
/*
输出结果:2015-09-01 19:13:45.846 synthesize基本使用[813:21032] _age = 0, age = 88
所以 @synthesize age; 读写的是 age 属性而不是 _age
如果成员变量 age 不存在,就会自动生成一个私有的成员变量 age(在.m实现文件中)
*/
多个属性可以通过一行@synthesize搞定,多个属性之间用逗号连接
@synthesize name = _name, age = _age, account = _account, password = _password;
私有成员:
访问修饰符:
@public
>可以在其它类中访问被public修饰的成员变量
>也可以在本类中访问被public修饰的成员变量
>可以在子类中访问父类中被public修饰的成员变量
@private
>不可以在其它类中访问被private修饰的成员变量
>可以在本类中访问被private修饰的成员变量
>不可以在子类中访问父类中被private修饰的成员变量
@protected
>不可以在其它类中访问被protected修饰的成员变量
>可以在本类中访问被protected修饰的成员变量
>可以在子类中访问父类中被protected修饰的成员变量
注意: 默认情况下所有的实例变量都是protected
@package
>介于public和private之间的
如果是在其它包中访问那么就是private的
如果是在当前代码所在的包种访问就是public的
私有变量:
写在@implementation中的成员变量, 默认就是私有的成员变量, 并且和利用@private修饰的不太一样, 在@implementation中定义的成员变量在其它类中无法查看, 也无法访问, 这种私有变量只能在本类中访问
在@interface中定义的变量, 无论使用什么成员变量修饰符修饰(包括@private), 我们都可以在其它类中看到这个变量 只不过有得修饰符修饰的变量我们不能操作而已
私有方法:
如果只有方法的实现, 没有方法的声明, 那么该方法就是私有方法 不过在OC中没有真正的私有方法, 因为OC是消息机制
// 访问只有实现没有声明的私有方法
id pp = [Person new];
[pp test]; Person *p = [Person new];
[p performSelector:@selector(test)];
@property增强
1 从Xcode4.4以后apple对@property进行了一个增强, 以后只要利用一个@property就可以同时生成setter/getter方法的声明和实现
2 默认@property会将传入的属性赋值给_开头的成员变量
3 如果利用@property来生成getter/setter方法, 那么我们可以不写成员变量, 系统会自动给我们生成一个_开头的成员变量
注意: @property自动帮我们生成的成员变量是一个私有的成员变量, 也就是说是在.m文件中生成的, 而不是在.h文件中生成的
4 @property有一个弊端: 它只会生成最简单的getter/setter方法的声明和实现, 并不会对传入的数据进行过滤, 如果想对传入的数据进行过滤, 那么我们就必须重写getter/setter方法
如果重写了setter方法, 那么property就只会生成getter方法
如果重写了getter方法, 那么property就只会生成setter方法
如果同时重写了getter/setter方法, 那么property就不会自动帮我们生成私有的成员变量
#import <Foundation/Foundation.h>
@interface Member : NSObject @property NSString * name;
@property int age;
@property NSString * account;
@property NSString * password; @end #import "Member.h"
@implementation Member
@end
OC基础--Property的更多相关文章
- 五.OC基础--1.多态,2.类对象,3.点语法,4.@property&@synthesize,5.动态类型,内省(判断对象是否遵循特定的协议,以及是否可以响应特定的消息)
五.OC基础--1.多态, 1. 多态概念,定义:多态就是某一类事物的多种形态: 表现形式: Animal *ani = [Dog new]; 多态条件:1.有继承关系 2.有方法的重写 2.多态代码 ...
- OC基础笔记目录
OC基础(1) Objective-C简介 OC和C对比 第一个OC程序 面向对象思想 OC基础(2) 类与对象 类的设计 第一个OC类 对象方法的声明和实现 类方法的声明和实现 OC基础(3) 对象 ...
- OC基础 代理和协议
OC基础 代理和协议 1.协议 (1)oc语言中得协议:一组方法列表,不需要我们自己实现,由遵守协议的类来实现协议所定制的方法. (2)协议的使用步骤:制定协议-->遵守协议-->实现协议 ...
- OC基础 类的三大特性
OC基础 类的三大特性 OC的类和JAVA一样,都有三大特性:继承,封装,多态,那么我们就来看一下OC中类的三大特性. 1.继承 继承的特点: (1)子类从父类继承了属性和方法. (2)子类独有的属 ...
- OC基础 点语法的使用
OC基础 点语法的使用 1.创建一个Student类继承于NSObject,Student.h文件 #import <Foundation/Foundation.h> @interface ...
- OC基础16:复制对象
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.浅复制即是指针赋值,复制对象的修改会影 ...
- OC基础15:内存管理和自动引用计数
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.什么是ARC? (1).ARC全名为A ...
- OC基础7:变量和数据类型
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.有时候初始化需要让对象带有初始值,那么 ...
- OC基础5:继承
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.根类即是最顶层的类,父类也可称为超类: ...
随机推荐
- gradle相关配置内容解析
gradle 项目的构建工具,基于groovy语言.主要用于管理依赖包. as中一般将gradle下载在C:\Documents and Settings<用户名>.gradle\wrap ...
- HackPwn2015:IoT智能硬件安全威胁分析
HackPwn2015:IoT智能硬件安全威胁分析 360安全卫士 · 2015/08/26 14:43 IoT(物联网)是一种既危险又有趣的混合技术,所谓的混合技术包括移动应用程序.蓝牙.Wi-Fi ...
- understanding ECMAscript 6 ---- block bindings
Traditionally, the way variable declarations work has been one tricky part of programming in javascr ...
- EasyUI的combobox控件使用onchange 问题
在项目中几次都遇到了同样的问题,现在都不知道怎样解决了! 路过的朋友们帮我看看嘛!谢谢了! 最后我想要实现的效果是这样的. 在下拉列表中不存在值.(这里的是下拉列表中存在值的!) 但是在我输入值 ...
- SSH网上答题系统质量属性
我要做的事网上答题系统,通过注册登录到答题页面. 这其中数据库的连接靠Hibernate,数据库的增删改查用Sruts2实现. 关于Struts2的学习,仅仅在action的表面上,可以在action ...
- Javascript中apply、call、bind
网上文章虽多,大多复制粘贴,且晦涩难懂,我希望能够通过这篇文章,能够清晰的提升对apply.call.bind的认识,并且列出一些它们的妙用加深记忆. apply.call 在 javascript ...
- diskpart查看硬盘序列号
WIN + R键运行cmd,进如DOS界面: 1. systeminfo查看OS初始安装时间 2. diskpart工具查看硬盘序列号 (1)diskpart (2)lisk disk 查看主机安装的 ...
- 限制textarea输入内容长度(多浏览器兼容、鼠标操作可控)
限制textarea的输入内容长度,当从键盘输入,内容长度达到最大值时,只有输入Backspace.Delete.左移动.右移动有效,当用鼠标粘贴内容,则只保留最大值长度的内容.从而控制textare ...
- Visual Studio Code中文文档(一)-快速入门
Visual Studio Code是一个轻量级但是十分强大的源代码编辑器,重要的是它在Windows, OS X 和Linux操作系统的桌面上均可运行.Visual Studio Code内置了对J ...
- 数据库 'MessageManage' 的事务日志已满。若要查明无法重用日志中的空间的原因,请参阅 sys.databases 中的 log_reuse_wait_desc 列。
提供两种办法:(SQL Server2008) 注意:建议使用第一种方法.第二种方法只是删除已有日志文件,日后还会继续生成. 第一种方法:清空日志. 1.打开企业管理器,直接在查询分析器里执行:(如果 ...