您好,登錄后才能下訂單哦!
一、實例變量可見度
可見度 特點
public 實例變量可以在類的外部和內部操作
protected 實例變量只能在該類和其子類內操作 默認
private 實例變量只能在該類內訪問
內部:相應類的@implementation和@end之間
@interface Person : NSObject
{
@public
NSString*_name;
@protected
NSString*_gender;
int_age; //年齡
@private
NSString*_age;
}
mian.m文件中使用
Person * p = [[Person alloc] init];
p->_name = @"zhangyixing";
// p->_gender = @'m'; // 警告
// p->_age = 18; // 警告
為什么不使用@public 暴露細節 不符合封裝
在其他文件訪問@protected修飾的實例變量-----方法
提示:添加兩個方法。
賦值:通過方法傳入參數,在類的內部實現實例變量賦值。
取值:通過方法獲取實例變量的值。
二、方法--方法類型、返回值類型、方法名、參數列表
OC中的方法------類方法、實例方法
同一個中,所有的類方法中不能出現重名 所有的實例方法中不能出現重名
1、 類方法:只能類使用 [類名 類方法名]
在類方法中不能使用實例變量 調用類方法時沒有創建對象
聲明-----Person.h
+ (void)sayHi;
實現-----Person.m
+ (void)sayHi
{
NSLog(@"hi");
}
2、實例方法:只能對象使用 [對象 實例方法名]
聲明-----Person.h
- (void)sayHello;
實現-----Person.m
- (void)sayHello
{
NSLog(@"hello");
}
3、聲明方法 (返回值類型)沒有參數只寫方法名
(1)無返回值、無參數
- (void)sleep;
實現
- (void)sleep
{
NSLog(@"sleep");
}
使用
[p sleep];
(2)無返回值、有參數
語法--- :(參數類型)參數名
參數以:開頭 ":"標識參數,不能省略。有冒號必須有參數
///// 一個參數
- (void)eat:(NSString *)food;
實現
- (void)eat:(NSString *)food
{
NSLog(@"%@",food);
}
使用
[p eat:@"beef"];
///// 兩個參數
- (void)setName:(NSString *)name age:(NSInteger)age; // 賦值
實現
- (void)setName:(NSString *)name age:(NSInteger)age
{
_name = name;
_age = age;
// name和age是方法的形參,接收從外部傳入的值
}
使用
[p setName:@"zhangyixing" age:18];
(3) 有返回值、無參數
- (NSString *)getName; // 取值
實現
- (NSString *)getName
{
return _name;
}
使用
NSLog(@"name=%@",[p getName]);
// 方法名使用駝峰命名法---方法名: setName:age:
首字母小寫;第一個參數修飾符首字母大寫;
第二個首字母小寫;都使用駝峰命名法
4、方法使用----[person sayHi];
在OC中沒有”student調用sayHi“這種表述。
在OC中使用消息發送機制:[receiver message]。
正確表述:給student對象發送sayHi消息。
1)student接收到消息,即方法sayHi;
2)student找到sayHi方法,并執行。
三、setter、getter
1、簡述
在OC里,為實例變量賦值的方法稱作setter(設置器)。
讀取實例變量值的方法稱作getter(訪問器)。
我們之前寫的那些賦值取值的方法都可以稱作setter和getter。
2、實例
(1)設置_name實例變量的值
// setter方法是實例方法,沒有返回值,只有一個參數
// 方法名 set + 實例變量名(忽略_,使用駝峰命名法)
// 參數 跟操作的實例變量有關 類型跟操作的實例變量一致 實例變量名(忽略_)
- (void)setName:(NSString *)name;
實現
- (void)setName:(NSString *)name
{
_name = name;
// name是方法的形參,接收從外部傳入的值 _name實例變量
}
(2)訪問實例變量
// getter是實例方法 沒有參數 返回值類型與操作的實例變量保持一致
// 方法名 實例變量名(忽略_) 切記:不要以get開頭
- (NSString *)name;
實現
- (NSString *)name
{
return _name;
}
(3)使用
// 使用setter方法給Person對象的實例變量_name賦值
[p setName:@"zhang"];
// 使用getter方法讀取實例變量的值
NSLog(@"name = %@", [p name]);
3、與實例變量的關系
無論setter還是getter內部操作的是實例變量
每個實例變量都需要一對setter和getter方法
4、main.m文件中使用
// 使用setter方法給Person對象的實例變量_name 和_age賦值
[p setName:@"zhang"];
[p setAge:23];
// 使用getter方法讀取實例變量的值
NSLog(@"name = %@, age = %ld", [p name], [p age]);
四、自定義初始化方法
-(id)init這個初始化方法只能給實例變量設置默認值,不靈活
- (id)init
{
return self;
}
-(id)initWithName:自定義初始化法,根據需求定義初始化方法
// 自定義初始化方法 初始化對象時給_name和_age賦值
- (id)initWithname:(NSString *)name age:(NSInteger)age;
實現
- (id)initWithname:(NSString *)name age:(NSInteger)age
{
// 對象初始化時可以傳入姓名和年齡 將傳入的值賦值給實例變量
_name = name;
_age = age;
return self;
}
main.m文件中使用
Person * p3 = [[Person alloc] initWithname:@"zhangyixing" age:18];
Person * p4 = [[Person alloc] initWithname:@"liyifeng" age:20];
NSLog(@"name=%@",[p3 name]);
[p4 setName:@"liminhao"];
NSLog(@"name=%@",[p4 name]);
五、導入文件
1、#import導入頭件,即:導入頭件中的內容到當前類。
#import “”導入自定義類,自己創建的文件 從當前工程目錄開始查詢
#import <> 導入類庫中的頭文件,自己創建的文件 從當前工程目錄開始查詢
功能類似C語言中的#include,但是可以避免頭文件被重復導入。
容易出現循環導入頭文件問題。
2、#include 和 #import的區別
(1)include不能重復導入同一個文件
(2)import可以重復導入同一個文件
3、@class
#import可能會造成循環導入頭文件問題,需要使用@class解決
@class的作用,告知編譯器系統class后面的標識符可以作為一個類名使用;并沒有導入這個類的內容
使用@class可以解決循環導入頭文件的問題。
如果需要在類的接口部分使用其他類型:
1)在.h文件中,使用@class聲明需要使用的類型;
2)在.m文件中,使用#import導入需要使用的類型
實例
創建Man、Woman、Child三個類并完成聲明與實現部分
新創建Family類
Family.h文件
#import <Foundation/Foundation.h>
// 使用@class“導入”文件
@class Man;
@class Woman;
@class Child;
@interface Family : NSObject
// 定義實例變量
{
Man * _father;
Woman * _mother;
Child * _kid;
}
// 初始化方法設置father和mother
- (id)initWithFather:(Man *)father mother:(Woman *)mother;
// 聲明setter、getter方法
- (void)setFather:(Man *)father;
- (Man *)father;
- (void)setMother:(Woman *)mother;
- (Woman *)mother;
- (void)setKid:(Child *)kid;
- (Child *)kid;
// 聲明一般方法
- (void)introduce;
Family.m文件
#import "Family.h"
導入文件
#import "Man.h"
#import "Woman.h"
#import "Child.h"
@implementation Family
// 初始化方法設置father和mother
- (id)initWithFather:(Man *)father mother:(Woman *)mother
{
_father = father;
_mother = mother;
return self;
}
// 實現setter、getter方法
- (void)setFather:(Man *)father
{
_father = father;
}
- (Man *)father
{
return _father;
}
- (void)setMother:(Woman *)mother
{
_mother = mother;
}
- (Woman *)mother
{
return _mother;
}
- (void)setKid:(Child *)kid
{
_kid = kid;
}
- (Child *)kid
{
return _kid;
}
// 實現一般方法
- (void)introduce
{
NSLog(@"father:%@,mother:%ld,kid:%@", [_father name], [_mother age], [_kid gender]);
}
main.m文件
#import <Foundation/Foundation.h>
// 導入文件
#import "Man.h"
#import "Woman.h"
#import "Child.h"
#import "Family.h"
Man * m = [[Man alloc] initWithName:@"zhangjiashuai"];
Woman * w = [[Woman alloc] initWithName:@"zhangjiamei" age:18];
Family * f = [[Family alloc] initWithFather:m mother:w];
Child * c = [[Child alloc] initWithName:@"zhangyi" gender:@"m"];
[f setKid:c];
[f introduce];
六、總結
1、實例變量有3種常見的可見度:@public、@protected、@private。
@public違背了封裝特性,面向對象開發中很少使用;
@protected默認可見度,自己和子類中能使用—>訪問實例變量;
@private自己類中能使用—>訪問實例變量。
2、方法是OC的核心,采用消息機制:[receiver message]。
“-”message由對象來調用;
“+”message由類來調用。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。