所謂的內部,指的是相應類的@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實例變量的調用代碼截圖如下:
@private實例變量的調用代碼截圖如下:
注意:
使?@public關鍵字,暴露了類內部的細節。
不符合面向對象語言的三大特性之?——封裝。
因此,實際開發時盡量避免將實例變量聲明為public。
Objective-C中的方法分兩種:類方法和實例方法。
類方法:只能類使用,例如:+(id)alloc 注:類方法中不能使用實例變量。
實例方法:只能對象使用,例如: -(void)sayHi
刪除方法類型標識,返回類型,參數類型,參數名,空格。例如:
replaceObjectAtIndex:withObject:
類中不能出現同名方法,“ : ” 標識參數,不能省略,有冒號必須有參數。
- (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方法,並執行。在OC裡,為實例變量賦值的方法稱作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 <> 導入類庫中的頭文件。功能類似C語言中的#include,但是可以避免頭?件被重復導入,但容易出現循環導入頭文件問題。
告訴編譯器@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