程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Objective-C學習筆記_實例變量可?度及方法

Objective-C學習筆記_實例變量可?度及方法

編輯:關於C語言

Objective-C學習筆記_實例變量可?度及方法


? 實例變量可?度

可見度 特點 public(公有的) 實例變量可以在類的外部和內部操作 protected(受保護的,默認的) 實例變量只能在本類和其?類內部操作 private(私有的) 實例對象只能在本類內訪問

所謂的內部,指的是相應類的@implementation和@end之間。

示例代碼如下:

#import 

@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實例變量的調用代碼截圖如下:

@protected實例變量的調用代碼截圖

@private實例變量的調用代碼截圖如下:

@private實例變量的調用代碼截圖

注意:

使?@public關鍵字,暴露了類內部的細節。

不符合面向對象語言的三大特性之?——封裝。

因此,實際開發時盡量避免將實例變量聲明為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消息。

person接收到消息,即方法sayHi; 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 
@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 
@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
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved