Objective-C基础学习笔记(六)-property作用-构造方法-OC成员变量的作用域

一. 点语法

点语法的本质是方法调用,并不是访问成员变量,编译器看到点语法有两种处理

1 .是赋值,赋值的就是展开为set方法

2. 不是赋值:展开为set方法

使用示例:

Person类的声明:

点语法的测试:

二. OC成员变量的作用域

@public :任何地方访问

@private :只能在当前类的对象方法中直接访问

@protected :能在当前类和子类中直接访问(默认)

@package :只要处于同一个框架中就能直接访问对象成员变量

 

三. @property 与 @synthesize

由于类的封装性,要求我们要自己给外部提供一些方法去访问我们的成员变量,这方法在OC中就是set或get方法,但由于set或get方法格式固定,且如果成员变量过多,写起来很花费时间且没有太大的帮助,于是就有了下面的两个关键字帮助我们完成set和get方法:

1. @property

1) 用在@interface 中

2)用来自动生成setter和getter

3) @propertyint age;就可以替换下面两行

- (void)setAage:(int)age;

- (int)age;

2. @synthesize

1> 用在@implementation中

2> 用来自动生成自动生成set和get方法实现

3>  用@synthesize age = _age;就可以替代

1  - (int)age
2 {
3     eturn _age;
4 }
5 - (void)setAge:(int)age
6 {
7     _age = age;
8 }

说明:xcode4.几以后@property独揽了@synthesize功能即@property可同时生成 set和get方法的声明和实现,成员变量都不用声明,缺点是成员变量私有,要自己加成员变量 protect

@property使用示例:

Person类的声明:

 1 #import <Foundation/Foundation.h>
 2
 3 @interface Person : NSObject
 4
 5 // @property 可自动生成某个成员的set和get声明
 6 // 成员变量名不能加 _
 7 // 如果成员变量不存在,则会自动生成 private类型
 8 @property int age;
 9 //- (void)setAage:(int)age;
10 //- (int)age;
11 @end 

Person类的实现:

测试:

#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const charchar * argv[])
{
        Person *p = [Person new];
        /* 点语法的使用 */
        p.age = 5;
        NSLog(@"p.age %d ",p.age);  

    return 0;
} 

set[762:52529] p.age 5 

手动实现的情况

1)若手动实现了set方法,编译器只会自动生成get 方法

2)若手动实现了get方法,编译器只会自动生成set 方法

3)若手动同时实现了set方法和get方法,编译器不会自动生成不存在的成员变量

原则: 你有的我就不帮你实现,你实现了get我就只生成set;如果你实现了set 和get 则不会生成成员变量。

四.id简介:

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

2. id 类型定义

1 typedef struct obj object{
2      Class isa;
3 }*id;

使用示例:

id p = [Person new];

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

五.OC构造方法:

1.什么是构造方法,构造方法是用来干什么的,为什么要有构造方法?

构造方法是用来初始化对象的方法,以- 开头,由于使用new方法创建的对象,对象的成员的初始值都为0,这在开发中很不方便,经常要在创建对象时就初始化好一些属性的值,所以使用这个构造方法可以满足这个需求。

2.使用系统自带的new创建对象的过程:

[Person new];

完整的创建一个可用对象,new做什么事情,调用两个方法

1.分配存储空间(一个对象)+alloc

2.初始化      -init 方法完成初始化,这过程通常是将成员的属性设置为0。

3.不使用new,自己创建对象的方法:

/* 1. 调用 +alloc 分配存储空间 */
//Person *p1 = [Person alloc];  

/* 2. 调用 - init进行初始化 */
//Person *p2 = [p1 init];  

// 直接一句话搞定 开发中常用,初始化自己的值
Person *p3 = [[Person alloc] init];  

4.如何使用构造方法设置对象成员的初始值?

现有一个需求:每个Person对象创建出来,他的_age都是10;

思路一: 重写 -init 方法:

重写-init 方法示例:

Person类的定义

#import <Foundation/Foundation.h>  

@interface Person : NSObject  

@property int age;  

@end  

Person类的实现重写父类的init方法,将_age初始化为10

 1 @implementation Person
 2
 3 /* 重写 -init 方法 */
 4 - (id)init
 5 {
 6     // 1.一定要调用super的init方法:初始化父类中声明的一些成员变量
 7
 8     // 2.如果对象初始化成功,才有必要进行接下来的初始化
 9     // 为保证初始化之后返回的是正确的
10     if (self = [super init])
11     {// 初始化成功
12         _age = 10;
13     }
14
15     // 3. 返回一个已经初始化完毕的对象
16     return self;
17 }
18
19 @end  

测试代码:

1 int main()
2 {
3     /* 需求每个Person对象创建出来,他的_age都是10 */
4     // Person *p = [[Person alloc] init];
5     NSLog(@"p age %d",p.age,);
6     return 0;
7 }  

2015-03-23 14:09:43.375 构造方法[917:81284] p age 10 

思路二: 自定义构造方法,

自定义构造方法:两部分-声明和实现

自定义构造方法规范:

1. 一定是对象方法

2. 返回值是id类型

3. 方法名以init 开头

使用示例:

Person类的声明:自定义构造方法用户设置名字和年龄

#import <Foundation/Foundation.h>  

@interface Person : NSObject
{
    NSString *_name;
    int _age;
}
@property NSString *name;
@property int age;  

// 自定义构造方法:两部分 声明和实现
/*
    自定义构造方法规范:
    1.一定是对象方法
    2.返回值是id类型
    3.方法名以init 开头
 */
- (id)initWithName:(NSString *)name andAge:(int)age;
@end  

Person类实现

#import "Person.h"  

@implementation Person
- (id)initWithName:(NSString *)name andAge:(int)age
{
    /* 无论自己写还是改写 都必须执行父类初始化 */
    if(self = [super init])
    {
        _name = name;
        _age = age;
    }
    return self;
}
@end  

测试代码:

#import "Person.h"
#import "Student.h"
int main()
{
    /* 使用自定义构造方法初始化person对象的名字和年龄*/
    Person *p = [[Person alloc] initWithName:@"mike" andAge:18];
    NSLog(@"name %@ age %d",p.name,p.age);
    return 0;  }

2015-03-23 14:20:15.727 自定义构造方法[966:85096] name mike age 18

总结:构造方法就是用来初始化成员变量的,成员变量属于父类就在父类中初始化。

时间: 2024-10-07 06:39:50

Objective-C基础学习笔记(六)-property作用-构造方法-OC成员变量的作用域的相关文章

Java基础学习笔记六 Java基础语法之类和ArrayList

引用数据类型 引用数据类型分类,提到引用数据类型(类),其实我们对它并不陌生,如使用过的Scanner类.Random类.我们可以把类的类型为两种: 第一种,Java为我们提供好的类,如Scanner类,Random类等,这些已存在的类中包含了很多的方法与属性,可供我们使用. 第二种,我们自己创建的类,按照类的定义标准,可以在类中包含多个方法与属性,来供我们使用. 这里我们主要介绍第二种情况的简单使用. 自定义数据类型概述 在Java中,将现实生活中的事物抽象成了代码.这时,我们可以使用自定义的

JSP的页面连接和提交方式(web基础学习笔记六)

一.GET请求新页面 1.1.超链接请求新页面 <!-- 超链接到page2 --> <a href="page2.jsp">链接到page2</a><br> <!-- 超链接到page2,弹出新窗口 --> <a href="page2.jsp" target="_blank">在窗口中链接到page2</a><br> <!-- 相对路径链接到

Android(java)学习笔记:109:通过反射获取成员变量并且使用

1 package cn.itcast_03; 2 3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.Field; 5 6 /* 7 * 通过发生获取成员变量并使用 8 */ 9 public class ReflectDemo { 10 public static void main(String[] args) throws Exception { 11 // 获取字节码文件对象 12 Class c = C

java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessController的checkPerssiom方法,访问控制器AccessController的栈检查机制又遍历整个 PerssiomCollection来判断具体拥有什么权限一旦发现栈中一个权限不允许的时候抛出异常否则简单的返回,这个过程实际上比我的描述要复杂 得多,这里我只是简单的一句带过,因为这

linux基础学习笔记——操作大全

作者:liaoyi 更新时间:2014-6-2 ****************基本操作***************** 关机 shutdown -h now    root用户               init 0              root用户halt      root+一般用户poweroff 重启shutdown -r now    root用户init6     root用户reboot            root+一般用户 注意:1.shutdown 比较灵活,可

js基础学习笔记(三)

3.1 认识DOM 文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法.DOM 将HTML文档呈现为带有元素.属性和文本的树结构(节点树). 先来看看下面代码: 将HTML代码分解为DOM节点层次图: HTML文档可以说由节点构成的集合,三种常见的DOM节点: 1. 元素节点:上图中<html>.<body>.<p>等都是元素节点,即标签. 2. 文本节点:向用户展示的内容,如<li>...</li&g

HTML&CSS基础学习笔记8-预格式文本

<pre>标签的主要作用是预格式化文本.被包围在 pre 标签中的文本通常会保留空格和换行符.而文本也会呈现为等宽字体. <pre>标签的一个常见应用就是用来表示计算机的源代码.当然你也可以在你需要在网页中预显示格式时使用它. 会使你的文本换行的标签(例如<h>.<p>)绝不能包含在 <pre> 所定义的块里.尽管有些浏览器会把段落结束标签解释为简单地换行,但是这种行为在所有浏览器上并不都是一样的. 更多学习内容,就在码芽网http://www.

ASP.Net MVC开发基础学习笔记(3):Razor视图引擎、控制器与路由机制学习

首页 头条 文章 频道                         设计频道 Web前端 Python开发 Java技术 Android应用 iOS应用 资源 小组 相亲 频道 首页 头条 文章 小组 相亲 资源 设计 前端 Python Java 安卓 iOS 登录 注册 首页 最新文章 经典回顾 开发 Web前端 Python Android iOS Java C/C++ PHP .NET Ruby Go 设计 UI设计 网页设计 交互设计 用户体验 设计教程 设计职场 极客 IT技术

ASP.Net MVC开发基础学习笔记:三、Razor视图引擎、控制器与路由机制学习

一.天降神器“剃须刀” — Razor视图引擎 1.1 千呼万唤始出来的MVC3.0 在MVC3.0版本的时候,微软终于引入了第二种模板引擎:Razor.在这之前,我们一直在使用WebForm时代沿留下来的ASPX引擎或者第三方的NVelocity模板引擎. Razor在减少代码冗余.增强代码可读性和Visual Studio智能感知方面,都有着突出的优势.Razor一经推出就深受广大ASP.Net开发者的喜爱. 1.2 Razor的语法 (1)Razor文件类型:Razor支持两种文件类型,分