亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

objective-c語法快速過(4)

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

oc 里的字符串

字符串的快速創建(最簡單的方法)

NSStirng *str = @“Hello”;//oc的字符串都是@“”形式的

oc的字符串也是類的對象,是NSString類的對象,創建沒有那么麻煩不用[ ],使用面向對象的思想來操縱字符串。

 char *name = "xxxxx";//c風格字符串

oc使用 %@ 輸出字符串,不是%s

NSString *name = @”dashuai”;NSLog(@“我的名字是%@”,  name);

c 風格字符串輸出解析的用法是%s

NSLog(@"%s", name);//%s是c風格的格式化解析

OC字符串的另一方式,Foundation 框架里的 NSString 類

NSString *newStr = [NSString stringWithFormat:@"My age is %d and no is %d and name is %@", age, no, name];NSLog(@"---- %ld", [newStr length]); 
length方法,返回unsigned long類型
 NSString *name = @"哈哈達到";// length方法算的是字數總數,包含的文字的數目!不是求字符個數??! int size = [name length];

不懂就去查詢文檔!百度!

 

//  main.m#import <Foundation/Foundation.h>/* NSString : 不可變字符串 NSMutableString : 可變字符串 */int main(){    NSMutableString *s1 = [NSMutableString stringWithFormat:@"my age is 10"];    // 拼接內容到s1的后面    [s1 appendString:@" 11 12"];        // 獲取is的范圍    NSRange range = [s1 rangeOfString:@"is"];    [s1 deleteCharactersInRange:range];        NSString *s2 = [NSString stringWithFormat:@"age is 10"];       //新建字符串,拼接好的字符串到新建的字符串里,但是原來的字符串沒有變!兩個方法不一樣。    NSString *s3 = [s2 stringByAppendingString:@" 11 12"];    NSLog(@"s1=%@, s2=%@", s1, s2);        return 0;}void stringExport(){    // 字符串的導出    [@"Jack/nJack" writeToFile:@"/Users/apple/Desktop/my.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];        NSString *str = @"4234234";    NSURL *url = [NSURL fileURLWithPath:@"/Users/apple/Desktop/my2.txt"];    [str writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:nil];}void stringCreate(){    /*     1.字符串的創建     */    NSString *s1 = @"jack";        //NSString *s2 = [[NSString alloc] initWithString:@"jack"];這種方法不推薦!        NSString *s3 = [[NSString alloc] initWithFormat:@"age is %d", 10];        // C字符串 --> OC字符串    NSString *s4 = [[NSString alloc] initWithUTF8String:"jack"];    // OC字符串 --> C字符串    const char *cs = [s4 UTF8String];        // NSUTF8StringEncoding 用到中文就可以用這種編碼    NSString *s5 = [[NSString alloc] initWithContentsOfFile:@"/Users/apple/Desktop/1.txt" encoding:NSUTF8StringEncoding error:nil];        // URL : 資源路徑    // 協議頭://路徑    // 本地文件   file://    // ftp://    // 網頁資源 http://weibo.com/a.png    // http://www.baidu.com        // NSURL *url = [[NSURL alloc] initWithString:@"file:///Users/apple/Desktop/1.txt"];    NSURL *url = [NSURL fileURLWithPath:@"/Users/apple/Desktop/1.txt"];        NSString *s6 = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];    NSLog(@"s6=/n%@", s6);        /*     一般都會有一個類方法跟對象方法配對     [NSURL URLWithString:<#(NSString *)#>];     [NSString stringWithFormat:@""];     [NSString stringWithContentsOfFile:<#(NSString *)#> encoding:<#(NSStringEncoding)#> error:<#(NSError *__autoreleasing *)#>];      */}

 

OC的 set 和 get 方法

類的成員變量盡量不要@public,保持數據的隱蔽性和封裝性,使用對象直接訪問類的成員變量也不推薦,因為這樣類的成員變量可以被隨意的修改,不安全,而是應該間接的調用。并且直接調用會讓別人一下子就看到了類的內部結構和信息,失去了封裝的意義。

set方法

1)   作用:用來設置成員變量,可以在方法里面過濾掉一些不合理的值

2)   命名規范:

  • 方法名都是以set開頭,而且后面跟上成員變量名,成員變量名的首字母必須大寫
  • 一定接受參數,且形參名稱不要跟成員變量同名
  • 返回值void

get方法

1)   作用:返回對象內部的成員變量

2)   命名規范:get方法的名稱一般就跟成員變量同名

/*成員變量的命名規范:一定要以下劃線 _ 開頭@interface Student : NSObject{   1.讓成員變量和get方法的名稱區分開  2.可以跟局部變量區分開,一看到下劃線開頭的變量,一般都是成員變量  */    int _no;    Sex _sex;}// sex的set和get方法- (void)setSex:(Sex)sex;- (Sex)sex;// no的set和get方法- (void)setNo:(int)no;- (int)no;@end

oc特有的語法—兼容c系列的點語法 

可以使用點語法來代替oc古怪的對象調用的形式。這是oc特有的讓其他(主要是習慣了 c 系列編程語言的程序員,比如 c,c++,java等)程序員快速看懂的一個做法。

 // 點語法的本質還是方法調用    p.age = 10; // [p setAge:10];

這里還是古怪,到底是get還是set方法,要看是給它賦值了(set),還是被賦值了(get)。還是和java或c++的點語法區分。

oc 中類的成員變量的作用于

 @public : 在任何地方都能直接訪問對象的成員變量

 @PRivate : 只能在當前類的對象方法中直接訪問。私有成員只能在本類被直接訪問,子類不可見,只能是set和get方法訪問(@implementation中默認是@private,因為一般不會包含實現文件,都是包含頭文件,故實現文件默認是私有的

 @protected : 可以在當前類及其子類的對象方法中直接訪問  (@interface中默認就是@protected

 @package : 只要處在同一個框架中,就能直接訪問對象的成員變量,不常用

 @interface和@implementation中不能聲明同名的成員變量,同名沖突,很好理解

Xcode的一個特性@property和@synthesize

s?nθ??sa?z v綜合合成;(通過化學或生物)合成;(音響)合成

@property

自動生成set和get方法,類似java的eclipse的 setter 和 getter選項

#import <Foundation/Foundation.h>@interface Person : NSObject{    int _age;    int _height;    double _weight;    NSString *_name;}// @property:只能用在聲明里,可以自動生成某個成員變量的setter和getter聲明,并且和java還不一樣,xcode把自動的聲明隱藏,不可見。這是編譯器的特性!下面這一句,代表注釋的那兩句。@property int age;//- (void)setAge:(int)age;//- (int)age;@property int height;//先生成set再get//- (void)setHeight:(int)height;//- (int)height;- (void)test;@property double weight;//如果成員變量類型一樣,可以合并在一起寫,但是實際開發不這樣,分開比較好@property NSString *name;@end

注意:@property里的變量age如果沒有被提前聲明,那么也是可以運行的,編譯器會自動生成_age成員變量,xcode4.4版本之后有的。這樣生成的成員變量,在類聲明里是@private。若類聲明里存此成員變量,如果@property還是那么寫,就不會再自動生成。

 @synthesize

只寫在實現里。可以自動去類聲明里找@property,然后根據它去生成類的成員變量的setter和getter方法的實現,并且會訪問這個成員變量

@synthesize age = _age;

 如果這樣寫,默認會訪問age這個成員變量,如果沒有age,就會自動生成@private類型的age變量,都是自動存在類聲明里。

注意:xcode4.4之后,為了讓程序員把精力放在業務邏輯上,而不是無謂的垃圾代碼的書寫上,xcode變得越來越方便,做的東西也越多,現在可以省略類的成員變量的聲明,直接@property就可以自動生成變量和配套的set與get方法的聲明。同樣,4.4之后,類的實現里,@synthesize也不用寫了。也就是說,set和get的實現不用寫。

意味著,現在的@property 聲明,類聲明里的@property默認做兩個事情,即生成set和get的聲明,也生成set和get的實現。當然,如果類聲明里沒有變量聲明,那么還要做第三個事情,自動生成私有的成員變量。

Xcode原則就是:沒有,我替你生成,有我就直接用。

這里就可以解釋為什么蘋果建議類的成員變量前面加下劃線?

因為@property 的新特性:自從 xcode4.4之后,@property 就獨攬了@synthesize 的功能,也就說,@proeprty 可以同時生成成員變量的 set,get 方法的聲明和實現,兩個都能。默認的情況下,set 和 get 方法的實現,會去訪問下劃線的成員變量,故要求類的聲明里使用下劃線的變量命名方式命名成員變量。說到底:就是因為新特性的@property自動生成set,get方法的聲明和實現,默認訪問的都是前面帶下劃線的成員變量。

oc 里的 id 類型(萬能指針)

id 是一種類型

類型不能做變量名,好比 int  int;是錯誤的,一個道理。

Id 是萬能指針

能指向(操縱)任何的 oc 對象,而且不能加*,只寫id就代表指針(因為 id內部已經包含*,見官方文檔)。

 Person *p = [Person new];//傳統的操作人的對象,人類型指針p 指向人的對象

萬能指針,id能指向 or 操作任何OC對象,只適合用在 oc 對象上

id d = [Person new];//id 指向人的對象      

id 的缺點:

如果同樣是指向(調用)類不存在的對象方法,那么編譯器直接報錯!不會弱語法了

千萬別加*

oc 的構造方法和重寫 

構造方法:用來初始化對象的方法,oc里是個對象方法,-開頭  -init

面向對象的語言,都包含的東西---構造方法,用和 c++類似的new 這個類方法創建對象,其實不好。

// Person *p = [Person new];不推薦這樣創建對象

new 其實是類方法,是 NSObject 類的方法,可以創建對象,分配內存,但是事實上,我們不常用,因為太死板,做的事情很單調,就是完整的創建一可用對象。

完整地創建一個可用的對象其實分兩步:

 1.分配存儲空間  +alloc

 2.初始化 -init

new 方法做這兩個事情,new 方法內部,調用兩個方法(一個類方法,一個對象方法)完成這個步驟,細節為:

1.調用+alloc分配存儲空間

Person *p1 = [Person alloc];//此時對象不可用,沒有初始化,返回 id(oc 對象)

2.調用-init進行初始化

Person *p2 = [p1 init];反回 oc 對象(已經初始化之后)本身

說明 new 是兩個方法的聯合,開發不常用,比較死板,一般分兩步做,這樣后果是方便選擇。因為初始化不一定必須是 init對象方法初始化。。

兩步合并的簡單寫法:掌握,開發常用這個寫法,從此不用 new 了。

Person *p4 = [[Person alloc] init];

Oc的構造方法就是-init 方法,用來初始化對象的方法。對象方法,每個對象內部的成員變量默認都初始化為0,

創建 person 對象,保證她的_age 默認都是10,不是0,怎么做?

需要重寫 –init方法,覆蓋父類 –init方法

重寫構造方法的目的:

為了讓對象創建出來,成員變量就會有一些固定的值

重寫構造方法的注意點

1.先調用父類的構造方法([super init])

2.再進行子類內部成員變量的初始化,和 c++類似。

Person.h#import <Foundation/Foundation.h>@interface Person : NSObject@property int age;@endPerson.m#import "Person.h"@implementation Person// 重寫-init方法,其實 id 有些類似 c++的模板的應用。//- (id)init//{//    1、一定要先調用super的init方法:先初始化父類中聲明的一些成員變量和其他屬性     self = [super init]; // 返回的是當前oc對象,一定用 self接受,這里需要好好研究,先知道。//    2.如果父類對象初始化成功,才有必要進行接下來的初始化//    if (self != nil)//    { //        _age = 10;//    }//    //    3.返回一個已經初始化完畢的oc對象//    return self;//}
//綜合的寫法,熟練之后如下這樣寫:- (id)init{ if ( self = [super init] ) { _age = 10; } return self;}@end

要求:

學生類的學生對象,初始化完畢之后,年齡都是10,學號都是1.還是重寫構造方法-init

Student.h繼承 person 類#import "Person.h"@interface Student : Person@property int no;@end

Student.m#import "Student.h"@implementation Student// 學生對象初始化完畢后,年齡就是10,學號就是1- (id)init{ if ( self = [super init] ) { _no = 1; } return self;}@end

main.h#import <Foundation/Foundation.h>#import "Person.h"#import "Student.h"int main(){ // 每個stu對象創建出來,他的_age都是10,學生學號都是1,isa 指向本身每個 p4對象創建出來,她的 _age 都是10,isa 指向本身類 Person *p4 = [[Person alloc] init]; Student *stu = [[Student alloc] init]; return 0;}

student 繼承了 person ,而 person繼承了 NSObject,比如 student 對象內部有三個成員變量,分別為: student 自己的_no,和繼承自父類 person 類的_age,還有 person 最開始就繼承的父類NSObject 的 isa指針,這個三個成員變量,都是 student 對象 stu 包含的!

 

因為student 類 創建 student 對象的時候,先進入 student 類查找-init,(因為 oc 里規定,如果父類和子類有同名方法,子類對象優先調用子類同名方法),然后 在 student 類里發現- (id)init方法,之后又發現:

{    if ( self = [super init] )這句話,那么編譯器會率先進入到父類 person,因為 super 的作用    {        _no = 1;    }    return self;}

然后先調用直接父類 person 的 –init,而 person 的-init為:

- (id)init{    if ( self = [super init] )還是執行到此,我們發現調試就進不去了,因為 super 調用的是 NSObject,蘋果是不開源的,但是事實還是進去偷著執行 NSobject 的-init 方法,初始化isa 指針, 把 isa 初始化為指向student 類本身,記住是當前的類,初始化完畢,程序執行回到 person 類,繼續向下執行_age=10。(同時student 的成員變量 age 變為10)    {        _age = 10;    }    return self;最后返回的 self 指向的是 當前student 的對象}

當person的-init 調用完畢,最后才回到 子類student 類,繼續執行 student 的-init, 執行_no=1,繼承來的 isa 初始化為指向本身 student 類,這才初始化完畢。

person 對象初始化的時候,同理,先在本類查找初始化方法,發現 super 語句,然后再去父類 NSObject 類 里查找-init方法,(這里先記住 self=[super init]的寫法,下來再深入),NSObject 做一件事,那就是初始化 isa,把 isa 指向 person 類本身,(指向當前類,這個類是畢源的,看不到內部代碼)然后回到 person類,_age=10。執行完畢。

再看一看 student 對象,創建的時候,先初始化,同理在本類,然后 發現 super,那么去父類 person 執行-init,還是發現 super,還是去 NSObject執行-init,把 isa 指向 student 類本身,(當前類不是 person,是 student 了)然后回到 person,_age=10.回到student,_no=1,執行完畢,再回main 函數,初始化,完畢。

oc構造方法的自定義

 oc自定義構造方法的規范

 1.一定是對象方法, 故一定以 - 開頭

 2.返回值一般是id類型

 3.方法名一般以initWith開頭

這讓我想起了,c++構造函數的含參構造和默認構造,和不帶參數的構造,意義是類似的。其實就是帶參構造。和 c++大同小異。

Person.h#import <Foundation/Foundation.h>@interface Person : NSObject@property NSString *name;@property int age;- (id)initWithName:(NSString *)name;- (id)initWithAge:(int)age;- (id)initWithName:(NSString *)name andAge:(int)age;@endPerson.m#import "Person.h"@implementation Person- (id)initWithName:(NSString *)name{    if ( self = [super init] )固定寫法,記住    {        _name = name;    }    return self;}- (id)initWithAge:(int)age{    if ( self = [super init] )    {        _age = age;    }    return self;}- (id)initWithName:(NSString *)name andAge:(int)age{    if ( self = [super init] )    {        _name = name;        _age = age;    }    return self;}@endStudent.h繼承 person 類#import "Person.h"@interface Student : Person@property int no;//_no 是子類 student 自己的屬性- (id)initWithNo:(int)no;- (id)initWithName:(NSString *)name andAge:(int)age andNo:(int)no;@endstudent.m#import "Student.h"@implementation Student- (id)initWithNo:(int)no{    if ( self = [super init] )    {        _no = no;    }    return self;}// 要理解和接受這個做法和思想:// 父類的屬性交給父類方法去處理,子類方法處理子類自己的屬性- (id)initWithName:(NSString *)name andAge:(int)age andNo:(int)no{// 將name、age傳遞到父類方法中進行初始化,no 在本類初始化使用了自定義的構造方法    if ( self = [super initWithName:name andAge:age])    {        _no = no;    }    return self;}@endmain.m#import <Foundation/Foundation.h>#import "Person.h"#import "Student.h"int main(int argc, const char * argv[]){    @autoreleasepool {        Student *p = [[Student alloc] initWithName:@"Jim" andAge:29 andNo:10];    }    return 0;}

每個對象創建之后,都有一個默認名,年齡,和學號,但是每個人的結果不一樣。此時,需要使用自定義構造方法初始化。否則重寫構造方法初始化的話(不帶參數)導致名稱都是一樣的。不符合程序要求。

首先,創建 student 對象,初始化對象指針 p(指向對象),先在本類找 initWithName 方法,確實有,然后進入執行,將name和age(都是繼承來的屬性)傳到父類方法中進行初始化:這樣分工明確(其實和 c++一樣的思路),自己做自己的事情,體現了良好的架構思想,還有這樣做的好處是,如果我們都統一在子類初始化,那么一旦父類的成員變量名稱改變了,會導致子類的代碼出錯,需要修改,一旦工程較大,后果不堪設想,而分工明確,自己做自己的事情,把父類的成員讓父類去初始化,子類只管自己的,就能做到不變應萬變。

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91社影院在线观看| 九九精品在线视频| 98视频在线噜噜噜国产| 91精品免费视频| 欧美一级大片在线免费观看| 国产精品男人爽免费视频1| 中文字幕精品一区二区精品| 疯狂做受xxxx欧美肥白少妇| 精品国产91久久久久久老师| 国内精品视频久久| 欧美一级免费视频| 国产91色在线播放| 国产日产欧美精品| 久热在线中文字幕色999舞| 国产精品扒开腿做爽爽爽视频| 国产丝袜精品第一页| 日韩欧美主播在线| 亚洲视频欧美视频| 欧美最猛黑人xxxx黑人猛叫黄| 亚洲人成毛片在线播放| 国产一区红桃视频| 亚洲精品久久久久久久久久久| 久久久久久久电影一区| 伊人久久精品视频| 久久久爽爽爽美女图片| 亚洲精品欧美一区二区三区| 精品久久久久久久久国产字幕| 国产欧美精品一区二区三区-老狼| 亚洲精品欧美极品| 亚洲欧美综合另类中字| 久久久久久久色| 国产在线观看精品一区二区三区| 91理论片午午论夜理片久久| 国产一区二区激情| 精品无人区太爽高潮在线播放| 国产精品视频999| 国产精品美女视频网站| 日韩精品在线视频美女| 懂色av影视一区二区三区| 国产精品一区二区性色av| 久操成人在线视频| 福利一区视频在线观看| 欧美激情视频免费观看| 亚洲国模精品一区| 777国产偷窥盗摄精品视频| 国内精品久久影院| 7777精品视频| 全球成人中文在线| 日韩高清a**址| 国产日韩欧美综合| 日韩视频免费观看| 亚洲福利视频二区| www.亚洲人.com| 国产精品一区二区三区久久| 欧美野外wwwxxx| 最近2019免费中文字幕视频三| 成人中心免费视频| 亚洲乱码国产乱码精品精| 欧洲成人性视频| 日韩精品免费综合视频在线播放| 亚洲精品中文字幕女同| 精品人伦一区二区三区蜜桃网站| 91精品视频在线播放| 精品久久久久久久久久ntr影视| 日韩av综合中文字幕| 91免费视频网站| 国产精品视频永久免费播放| 亚洲美女福利视频网站| 精品亚洲一区二区三区| 日韩有码视频在线| 成人福利视频在线观看| 欧美激情视频网站| 91免费高清视频| 日韩免费看的电影电视剧大全| 久久精品电影一区二区| 一区二区日韩精品| 91精品啪在线观看麻豆免费| 欧美性高潮床叫视频| 91黄色8090| 久久久av电影| 精品自拍视频在线观看| 国产视频在线一区二区| 91sao在线观看国产| 成人欧美一区二区三区黑人| 国产精品久久久久久久天堂| 国产精品丝袜视频| 欧美最猛性xxxxx(亚洲精品)| 国产99久久精品一区二区 夜夜躁日日躁| 日韩成人黄色av| 91精品国产综合久久久久久蜜臀| 国产精品久久久久久av福利软件| 成人国产精品一区二区| 日韩av在线高清| 亚洲欧美第一页| 亚洲一二在线观看| 国产在线拍揄自揄视频不卡99| 91精品国产色综合久久不卡98口| 国产精品一香蕉国产线看观看| 最近2019免费中文字幕视频三| 国模精品视频一区二区| 亚洲成人黄色网| 国产精品国内视频| 欧美日韩福利电影| 热久久免费国产视频| 国产精品欧美日韩久久| 日本电影亚洲天堂| 国产精品老女人精品视频| 亚洲午夜av久久乱码| 欧美日韩精品在线视频| 国产成人精品网站| 九九热这里只有精品免费看| 国产国语videosex另类| 国产精品久久久久久久久久| 亚洲一区二区三| 一区二区三区四区精品| 中文字幕亚洲国产| 国产欧美日韩丝袜精品一区| 国产午夜精品美女视频明星a级| 国产香蕉精品视频一区二区三区| 欧美激情视频一区二区三区不卡| 亚洲欧美成人网| 日韩精品视频在线播放| 国产成人精品优优av| 日本一区二区三区四区视频| 亚洲色图欧美制服丝袜另类第一页| 亚洲xxxx3d| 韩国日本不卡在线| 福利一区福利二区微拍刺激| 欧美大胆在线视频| 成人有码在线播放| 亚洲网站在线观看| 精品国产网站地址| 亚洲日本中文字幕免费在线不卡| 国产亚洲欧美日韩一区二区| 一区二区三区美女xx视频| 精品国产区一区二区三区在线观看| 亚洲精品免费网站| 欧美大片在线免费观看| 国产日韩视频在线观看| 国产69精品久久久久9| 国产美女扒开尿口久久久| 一夜七次郎国产精品亚洲| 日韩中文字幕网| 最近2019好看的中文字幕免费| 亚洲精品综合精品自拍| 日韩一区二区三区xxxx| 亚洲精品不卡在线| 日本aⅴ大伊香蕉精品视频| 日韩h在线观看| 国产成+人+综合+亚洲欧美丁香花| 久久人人爽人人爽人人片亚洲| 国产91精品久久久| 国产精选久久久久久| 亚洲老头老太hd| 久久久久久久国产精品| 一区二区三区美女xx视频| 91在线观看免费高清完整版在线观看| 91视频国产高清| 欧美精品成人91久久久久久久| www.亚洲免费视频| 欧美日韩国产精品一区二区不卡中文| 欧美丰满老妇厨房牲生活| 欧美日韩高清区| 国产精品久久77777|