麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

Objective-C面向對象(一)

2019-11-14 19:14:05
字體:
來源:轉載
供稿:網友

1.類和對象

1.1定義類

面向對象的程序設計中有兩個重要概念:類(class)和對象(object),類事某一批對象的抽象,對象是一個具體存在的實體。

Objective-C定義類需要氛圍2個步驟

  • 接口部分 :定義該類包含的成員變量和方法。
  • 實現部分 :為該類的方法提供實現。

定義接口部分的語法:

@interface MyClass:NSObject
{
int count;
id
data;
NSString* _name;
}
-(id)initWithString:(NSString)aName;
+(MyClass
)createMyClassWithString:(NSString* aName);
@end
@interface用于聲明定義類的接口部分,@end表明定義結束。其后緊跟該類d一對花括號用于聲明該類的成員變量;花括號后面的部分用于聲明該類的方法。定義類的接口聲明部分防災頭文件中。

  • 成員變量:用于描述該類的對象的狀態數據
  • 方法:用于描述該類的行為

定義成員變量
類型 成員變量名;

聲明方法:

- (void)insertObject:(id)anObject atIndex:(NSUInteger)index

方法類型標識:+ 或者- ,+代表該方法是類方法,直接類型即可調用;-代表該方法是實例方法,必須對象才能調用。

返回值類型:可以是OC允許的任何數據類型。

方法簽名關鍵字:由方法名,行參標簽和冒號組成。OC建議為后面的每個行參都指定一個行參標簽,該行參標簽可以很好的說明該行參的作用。

Objective-C的方法聲明中,所有的類型(包括void)都應該使用圓括號括起來。

定義實現部分的語法:

@implementation MyClass { int _count; id _data; NSString* _name; } -(id)initWithString:(NSString*)aName { //方法體 } +(MyClass*)createMyClassWithString:(NSString*)aName { //方法體 }

說明:

  1. 類實現部分的類型必須和類借口部分的類名相同。用于表示這是同一個類的接口部分和實現部分。

  2. 類實現部分也可以在類名后使用 ":父類名" 來表示繼承了某個父類,單一般沒必要。

  3. 類實現部分也可聲明自己的成員變量,但這些成員變量只能在當前類訪問。

    4.類實現部分必須為類聲明部分的每個方法提供方法定義。

1.2對象的產生和使用

定義變量: 類名* 對象名

創建對象: [[類名 alloc] 初始化方法]

alloc是OC的關鍵字,負責為類分配內存空間,創建對象,調用初始化方法對該實例執行初始化。所有的對象都繼承類NSObject ,所有的類都有一個默認的初始化方法:init.

也可以使用new創建對象 [類名 new]

OC調用方法的語法為:[調用者 方法名:參數 行參標簽:參數值 ...]

1.3 self

self關鍵字總是指向調用該方法的對象。self關鍵字最大的作用是讓類中的一個方法訪問該類中另一個方法或者成員變量。

#import <Foundation/Foundation.h>@interface FKWorf:NSObject{	NSString* _name;}-(void) setName:(NSString*)_name;-(void) info;@end@implementation FKWorf-(void) setName:(NSString*) n{	self->_name = n;}-(void) info{	NSLog(@"我是%@",self->_name);}@end int main(int argc, char const *argv[]){		@autoreleasepool	{		FKWorf* worf = [[FKWorf alloc] init];		[worf info];	}	return 0;}

1.4 id類型

任意類型的對象都可復制給id類型的變量

id p = [[FKWorf alloc] init];[p info];

2.方法詳解

OC中方法的所屬性:

  • 方法不能獨立定義,只能定義在類中
  • 從邏輯意義上看,方法要么屬于該類本身(+),要么屬于該類的一個對象(-)
  • 永遠不能獨立執行方法,執行方法必須使用類或對象作為調用者

2.1 形參個數可變的方法

定義方法時,在最后一個形參后增加逗號和三點(,...),則表明該形參可以接受多個參數值。

長度可變的形參只能處于形參列表的最后,一個方法中最多只能包含一個長度可變的形參。

定義語法:-(void)test:(NSString*)name,...

獲取形參:

  • va_list,定義指向可變參數列表的指針
  • va_start,函數,制定開始處理可變形參的列表,并讓指針指向可變形參列表的第一個參數
  • va_end,結束處理可變形參,釋放指針變量
  • va_arg,該函數范湖獲取指針當前指向的參數的值,并將指針指向下一個參數
-(void)test:(NSString*)name,...{	va_list argList;	//如果第一個name參數存在,才需要處理后面的參數	if(name)	{		NSLog(@"%@",name);		va_start(argList,name);		NSString* arg = va_arg(argList,id);		while(arg)		{			NSLog(@"%@",arg);			arg = va_arg(argList,id);		}		va_end(argList);	}}

3.成員變量

成員變量指的是在類接口部分或類實現部分定義的變量,OC的成員變量都是實例變量。

訪問實例變量 實例->實例變量

聲明實例變量,系統會為實例變量執行默認初始化,基本類型的實例變量默認被初始化為0,指針類型的成員變量默認被初始化nil

4.隱藏和封裝

4.1封裝

封裝是指將對象的狀態信息隱藏在對象內部,不允許外部程序直接訪問對象內部信息 ,而是通過該類提供的方法類實現對內部信息的操作和訪問。

4.2 訪問控制符

4個訪問控制符:@PRivate,@package,@protected,@public

4.3 @package 訪問控制符

@package修飾的成員變量,可以在當前類和同一鏡像的中訪問,同一鏡像是指,編譯后生成的同一個框架或同一個執行文件

4.4合成存取方法

  1. 在類接口部分使用@property指令定義屬性。使用@property定義屬性無需放在類接口的花括號里,直接放在@interface@end之間。@property指示符放在屬性定義的最前面。
  2. 在類中實現的部分使用@synthesize指令聲明該屬性。

以上步驟會合成成對的setter和getter方法,還會自動在類實現部分定義一個與getter方法同門的成員變量。

@sythesize property名[=成員變量名]

#import <Foundation/Foundation.h>@interface FKUser:NSObject@property (nonatomic) NSString* name;@property NSString* pass;@property NSDate* birth;//-(void)setName:(NSString*) name;@end@implementation FKUser@synthesize name=_name;@synthesize pass;@synthesize birth;-(void)setName:(NSString*) name{	self->_name=[NSString stringWithFormat:@"+++%@",name];}@endint main(int argc, char const *argv[]){	FKUser* user=[[FKUser alloc] init];	[user setName:@"唐僧"];	[user setPass:@"1234"];	[user setBirth:[NSDate date]];	NSLog(@"name=%@,pass=%@,birth=%@",[user name],[user pass],[user birth]);	return 0;}

@property和類型間用括號的額外指示符

  1. assign 指定對屬性只是簡單賦值,不更改對所賦的值的引用計數。用于NSinteger及short float double 結構體等C數據類型
  2. atomic(nonatomic) 默認atomic,指定合成的方法是否為原子操作,當一個線程進入存取方法的方法體后,其他線程無法進入該存、去方法,避免多線程冰法破壞對象的完整性。
  3. copy 使用copy,當調用setter方法對成員變量賦值時,會將被賦值的對象復制一個副本,再講該副本賦值給成員變量。
  4. gettersetter 用于為合成的getter、setter方法指定自定義方法名
    語法@property (assign,nonatomic,getter=wawa,setter=nana:) int price;
  5. readonly,readwrite(默認) ,readonly 指示系統只合成getter方法
  6. retain 屬性賦值時,原來所引用的對象的引用計數器減1,被賦值的對象引用計數加1
  7. strong,weak 強引用、弱引用,強引用指向被賦值的對象,name對象就不會自動回收;弱引用指向的對象可能被回收
  8. unsafe_unretainedweak相似,unsafe_unretained所引用的對象被回收后,unsafe_unretained指針不會被賦值為nil,可能導致程序崩潰

4.5 點語法


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: a网站在线| 成人免费看片a | 午夜久久视频 | av电影手机在线看 | 亚洲视频成人 | 久久久久国产成人免费精品免费 | 日韩色视频在线观看 | 一级全毛片 | 成人免费观看49www在线观看 | 高清一区二区在线观看 | 久久中文免费 | 成人免费福利视频 | 免费放黄网站在线播放 | 久久国产精 | 精国产品一区二区三区四季综 | 国内精品免费一区二区2001 | 新久草在线视频 | 国产羞羞网站 | 亚洲综合视频网站 | 最新精品在线 | 成年人黄色免费网站 | 在线视频 中文字幕 | 性欧美暴力猛交69hd | 日本中文字幕电影在线观看 | 一级@片 | 亚洲日本高清 | 一级大片视频 | 精品久久久久久成人av | 成人免费视频视频在线观看 免费 | 成人免费久久 | 91av大片| 久久精品免费网站 | 91麻豆精品国产91久久久无需广告 | 中文字幕综合在线观看 | 激情亚洲一区二区 | 日韩av片网站 | 九九热免费精品 | 免费a观看 | 欧美激情精品久久久久 | 久久亚洲激情 | 亚洲aⅴ在线观看 |