標籤: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執行個體變數的調用代碼如下:
注意:
使[email protected]關鍵字,暴露了類內部的細節。
不符合物件導向語言的三大特性之?——封裝。
因此,實際開發時盡量避免將執行個體變數聲明為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 <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學習筆記_執行個體變數可?度及方法