Objective-C学习笔记_实例变量可?度及方法

? 实例变量可?度

可见度 特点
public(公有的) 实例变量可以在类的外部和内部操作
protected(受保护的,默认的) 实例变量只能在本类和其?类内部操作
private(私有的) 实例对象只能在本类内访问

所谓的内部,指的是相应类的@implementation和@end之间。

示例代码如下:

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
    @public
    NSString *_hobby;  /**< 兴趣*/

    @protected
    NSString *_name;  /**< 姓名*/
    NSInteger _age;  /**< 年龄*/

    @private
    NSString *_sex;  /**< 性别*/
}
@end

@public实例变量的调用代码如下:

Person *person = [[Person alloc] init];
person->_hobby = @"打排球 看电影";
NSLog(@"兴趣: %@", person->_hobby);

@protected实例变量的调用代码截图如下:

@private实例变量的调用代码截图如下:

注意:

  1. 使[email protected]关键字,暴露了类内部的细节。
  2. 不符合面向对象语言的三大特性之?——封装。

因此,实际开发时尽量避免将实例变量声明为public。


? ?法

方法分类

Objective-C中的方法分两种:类方法和实例方法。

类方法:只能类使用,例如:+(id)alloc 注:类方法中不能使用实例变量。

实例方法:只能对象使用,例如: -(void)sayHi

?法声明

方法名

删除方法类型标识,返回类型,参数类型,参数名,空格。例如:

replaceObjectAtIndex:withObject:

类中不能出现同名方法,“ : ” 标识参数,不能省略,有冒号必须有参数。

赋值、取值方法(设置器、访问器或setter、getter)


- (void)setName:(NSString *)name;
- (NSString *)name;

- (void)setName:(NSString *)name
{
    _name = name;
}

- (NSString *)name
{
    return _name;
}

多参方法

- (instancetype)initWithName:(NSString *)name
                         sex:(NSString *)sex;

- (instancetype)initWithName:(NSString *)name
                         sex:(NSString *)sex
{
    self = [super init];
    if (self) {
        _name = name;
        _sex = sex;
    }
    return self;
}

方法使用

[person sayHi]

在Objective-C中没有”person调用sayHi“这种表述。在Objective-C中使用消息发送机制:[receiver message]

正确表述:给person对象发送sayHi消息。

  1. person接收到消息,即方法sayHi;
  2. person找到sayHi方法,并执行。

三 setter getter

在OC里,为实例变量赋值的方法称作setter(设置器)。

读取实例变量值的?法称作getter(访问器)。

我们之前写的那些赋值、取值的方法都可以称作setter和getter。

setter、getter的书写格式

OC规定了setter和getter的书写格式。如果一个实例变量是int age;或者int _age;

setter的书写格式如下:

- (void)setAge:(int)age; 即set + 忽略下划线的首字母大写的实例变量名。

getter的书写格式如下:

- (int)age; 即返回值类型与实例变量类型?致,?法名与实例变量名相同(忽略下划线)。

与实例变量的关系

无论setter还是getter内部操作的都是实例变量,每一个实例变量都需要一对setter和getter方法。

?定义初始化方法

-(id)init 这个初始化方法只能给实例变量设置默认值,不灵活。

-(id)initWithName: 自定义初始化方法,根据需求定义初始化方法。

示例代码如下:

- (instancetype)initWithName:(NSString *)name
                         sex:(NSString *)sex;

- (instancetype)initWithName:(NSString *)name
                         sex:(NSString *)sex
{
    self = [super init];
    if (self) {
        _name = name;
        _sex = sex;
    }
    return self;
}

#import

导入头文件,即:导入头文件中的内容到当前类。

#import “” 导入自定义类,#import <> 导入类库中的头文件。功能类似C语言中的#include,但是可以避免头?件被重复导入,但容易出现循环导入头文件问题

@class

告诉编译器@class后的字符串作为类名使用,并未导入类的接口内容。有效避免嵌套循环导入。

示例:Student类, 实例变量: 姓名, 年龄, 老师;Teacher类, 实例变量: 姓名, 年龄, 学生。

@class使用 的示例代码如下:

#import <Foundation/Foundation.h>
@class Student; /* @class 标记Student是一个类, 不导入任何实例变量和方法 */

@interface Teacher : NSObject
{
@protected
    NSString *_name;
    NSInteger _age;
    Student *_student; /* 学生 */
}

- (void)setName:(NSString *)name;
- (NSString *)name;

- (void)setAge:(NSInteger)age;
- (NSInteger)age;

- (void)setStudent:(Student *)student;
- (Student *)student;

- (id)initWithName:(NSString *)name
                 age:(NSInteger)age;

- (void)teacherInfo;
@end
#import "Teacher.h"
#import "Student.h" /* 在.m文件中导入头文件 */

@implementation Teacher
- (void)setName:(NSString *)name
{
    _name = name;
}

- (NSString *)name
{
    return _name;
}

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

- (NSInteger)age
{
    return _age;
}

- (void)setStudent:(Student *)student
{
    _student = student;
}

- (Student *)student
{
    return _student;
}

- (id)initWithName:(NSString *)name age:(NSInteger)age
{
    _name = name;
    _age = age;
    return self;
}

- (void)teacherInfo
{
    NSLog(@"name: %@ age: %ld myTeacher: %@", _name, _age, [_student name]);
}

@end
#import <Foundation/Foundation.h>
@class Teacher;

@interface Student : NSObject
{
@protected
    NSString *_name;
    NSInteger _age;
    Teacher *_myTeacher;
}

- (void)setName:(NSString *)name;
- (NSString *)name;

- (void)setAge:(NSInteger)age;
- (NSInteger)age;

- (void)setMyTeacher:(Teacher *)myTeacher;
- (Teacher *)myTeacher;

- (void)studentInfo;
@end
#import "Student.h"
#import "Teacher.h"

@implementation Student
- (void)setName:(NSString *)name
{
    _name = name;
}

- (NSString *)name
{
    return _name;
}

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

- (NSInteger)age
{
    return _age;
}

- (void)setMyTeacher:(Teacher *)myTeacher
{
    _myTeacher = myTeacher;
}

- (Teacher *)myTeacher
{
    return _myTeacher;
}

- (void)studentInfo
{
    NSLog(@"name: %@ age: %ld myTeacher: %@", _name, _age, [_myTeacher name]);
}
@end
#pragma mark 知识点5 @class使用
/* 作用: 避免循环导入 */
/* Student类, 实例变量: 姓名, 年龄, 老师
 * Teacher类, 实例变量: 姓名, 年龄, 学生
 */
#if 1
        /* 创建一个Teacher对象 */
        Teacher *teaOne = [[Teacher alloc] init];
        [teaOne setName:@"Tom"];
        [teaOne setAge:40];

        /* 创建一个Student对象 */
        Student *stuOne = [[Student alloc] init];
        [stuOne setName:@"Zhang San"];
        [stuOne setAge:18];
        [stuOne setMyTeacher:teaOne]; /* 先创建好teaOne对象 */

        [stuOne studentInfo];

        [teaOne setStudent:stuOne];

        [teaOne teacherInfo];

        /* 新Teacher对象 */
        Teacher *teaTwo = [[Teacher alloc] initWithName:@"Steve" age:50];
        [teaTwo setStudent:stuOne];
        [teaTwo teacherInfo];
#endif

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-29 15:02:08

Objective-C学习笔记_实例变量可?度及方法的相关文章

javascript学习笔记---ECMAScript-判断变量类型

判断类型之前,先要清楚有哪些类型. (理理思路:程序由数据和方法构成,数据由简单数据和复杂数据构成) 即类型有: 数据(简单数据:boolean,string,num,undefined,null.复杂数据:object), 方法(function) 万能的typeof,神一样的方法 typeof(1);// num typeof("hello");// string   typeof(false);// boolean var vFlag; typeof(vFlag);// unde

十五、Android学习笔记_授权过程

1.需要申请App Key和App Secret.不同的开发平台有不同的接入方式,可以参考文档,然后将这两个值放进去. 2.通过OAuth类实现认证,它会自动跳转到认证界面,进行授权,成功之后需要处理回调接口. 3.在第二步调用回调接口时,它会返回用户的基本信息,比如用户id.此时需要将用户id信息保存起来,为后面登录做准备.回调接口的写法就为myapp://AuthorizeActivity,其中scheme全部为小写字母. <activity android:name="com.wei

九、Android学习笔记_ Android开发中使用软引用和弱引用防止内存溢出

在<Effective Java 2nd Edition>中,第6条"消除过期的对象引用"提到,虽然Java有 垃圾回收机制,但是只要是自己管理的内存,就应该警惕内存泄露的问题,例如的对象池.缓存中的过期对象都有可能引发内存泄露的问题.书中还提到可以用 WeakHashMap来作为缓存的容器可以有效解决这一问题.之前也确实遇到过类似问题,但是没有接触过"弱引用"相关的问题,于是查阅了一些资料. <Java 理论与实践: 用弱引用堵住内存泄漏>

Linux 程序设计学习笔记----文件管理实例应用

一.使用ls -l 以排序方式输出目录信息 1.需求以及知识点覆盖 ls -l 命令根据后面的参数将列出某文件即目录下的基本信息. 如果没有具体的目录或者文件,则列出当前目录下所有的非隐藏文件的信息,包括文件类型,文件权限,硬链接个数,拥有者.拥有者所在组,文件大小,文件更新时间等. such as : 若没有指定的文件,则输出所有目录下的文件信息: 所以,本应用要实现的基本功能和需要的知识点有: ①参数检查.包括参数个数检查,如果有多个需要列出信息的文件及目录,则遍历所有的参数,另外需要读取当

Unity3d_学习笔记_入门

转自:http://blog.csdn.net/zlfxy/article/details/8722437 本文内容来自“编程教父”的视频课程. 1.Unity3d一个游戏引擎,可以用来开发很多游戏. 要利用Unity3d开发游戏,我们首先要下载一个Unity3d软件.下载后,下载一个破解补丁,这样就可以正常进行开发了. 2.Unity3d每次只能开启一个工程项目. (1)Unity3d中比较重要的一个对象就是摄像机了,摄像机就相当于我们人的眼睛,有了摄像机,运行程序后,才能够有视野. (2)U

JAVA学习笔记一:变量类型

Java语言支持的变量类型有: 类变量:独立于方法之外的变量,用 static 修饰. 实例变量:独立于方法之外的变量,不过没有 static 修饰. 局部变量:类的方法中的变量. public class Count { private static int staticnum=0;//静态变量 private int lvars=0;//实例变量 public void method(){ int i =0; // 局部变量 } public Count() { for(int i=0;i<

ASP.Net MVC开发基础学习笔记:二、HtmlHelper与扩展方法

一.一个功能强大的页面开发辅助类—HtmlHelper初步了解 1.1 有失必有得 在ASP.Net MVC中微软并没有提供类似服务器端控件那种开发方式,毕竟微软的MVC就是传统的请求处理响应的回归.所以抛弃之前的那种事件响应的模型,抛弃服务器端控件也理所当然. 但是,如果手写Html标签效率又比较低,可重用度比较低.这时,我们该怎样来提高效率呢?首先,经过上篇我们知道可以通过ViewData传递数据,于是我们可以写出以下的Html代码: <input name="UserName&quo

[51单片机学习笔记ONE]-----LED灯的多种使用方法

一.交替闪烁8个LED灯,时间间隔为1s 1 /****************************************************** 2 实验名称: 交替闪烁8个LED灯,时间间隔1s 3 实验时间: 2014年12月2日 4 ******************************************************/ 5 6 #include <reg51.h> 7 8 void delay(unsigned char a); 9 10 void m

struts2学习笔记(4)---------action中的方法调用

系统需要使用Action的不同方法来处理用户请求,这就需要让同一个Action里面包含多个控制处理逻辑. 1)动态方法调用 即DMI(dynamic method invocation),使用actionName!methodName的形式来指定想要调用的方法,如果想使用DMI,需要在struts.xml里面加入这句话: <constant name="struts.enable.DynamicMethodInvocation" value="true" /&