Objective-C學習筆記_執行個體變數可?度及方法

來源:互聯網
上載者:User

標籤:objective-c   ios   

? 執行個體變數可?度
可見度 特點
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

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

Objective-C學習筆記_執行個體變數可?度及方法

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.