IOS筆記-和新語法

一:點語法框架

1>用點語法替換set方法和get方法編輯器

 

 1
 2
 3
 4
 5
 6
 7
 8
// 方法調用
Student *stu = [Student new];
[stu setAge:100];
int age = [stu age];
 
// 點語法
stu.age = 100;
int age = stu.age;
 來自CODE的代碼片
點語法.m

2>點語法的本質spa

 

**其實點語法的本質仍是方法調用.net

 

**當使用點語法時,編譯器會自動展開成相應的方法指針

3>死循環注意code

 

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
- (void) setAge:(int)age
{
// 下面的代碼會引起死循環
self.age = age;
}
- (int) age
{
// 下面的代碼會引起死循環
return self.age;
}
 來自CODE的代碼片
死循環.m

 

 

二:成員變量的做用域對象

局部變量,全局變量都有本身的做用域。成員變量也有本身的做用域。blog

1>做用域類型ip

 

1.@private:只能在當前類的對象方法中直接訪問作用域

(能夠用get方法、set方法訪問);

(在@implementation中聲明的對象默認爲@private,@public無效)

 

2.@protect:只能在當前類和子類的對象方法中直接訪問

(在@interface中若是不加做用域類型,默認爲@protect)

 

3.@public:任何地方均可以直接訪問成員變量

 

4.@package:同一個「體系內」(框架)能夠訪問,介於@private和@public之間。

(只要處在同一個框架中,就能直接訪問對象的成員變量。)

注意:沒有@interface,只有@implementation,也能夠開發一個類。

@implementaion中不能定義和@interface中同名的成員變量。

三:編輯器特性:@property和@synthesize

1> @property 

用在@interface中,能夠自動生成成員變量的setter和getter聲明;

 

 1
 2
 3
 4
@property int age; // 能夠替代如下兩行
 
// -> -(void)setAge:(int)age;
// -> -(int)age;
 來自CODE的代碼片
@property.m

2>@synthesize

 

用在@implementation 中,能夠自動生成成員變量的set和get方法的實現。

 

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
@synthesize age = _age; // 能夠替代如下幾句
/*
-(void)setAge:(int)age
{
_age = age;
}
-(int)age
{
return _age;
}
*/
 來自CODE的代碼片
@synthesize.m
3>@synthesize的細節

@synthesize age = _age;

1.setter和getter實現中會訪問成員變量_age

2.若是成員變量_age不存在,就會自動生成一個@private的成員變量_age

@synthesize age;

1.setter和getter實現中會訪問成員變量age

2.若是成員變量age不存在,就會自動生成一個@private的成員變量age

手動實現

1.若手動實現了setter方法,編譯器就只會自動生成getter方法

2.若手動實現了getter方法,編譯器就只會自動生成setter方法

3.若同時手動實現了setter和getter方法,編譯器就不會自動生成不存在的成員變量

4> @property新特性

自從Xcode 4.x後,@property就獨攬了@synthesize的功能。也就是說,@property能夠同時生成setter和getter的聲明和實現

默認狀況下,setter和getter方法中的實現,會去訪問下劃線 _ 開頭的成員變量

因此在如今的Xcode版本下,能夠最大化的簡潔書寫。
舉例:
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
@interface Person:NSObject
// 成員變量的get set方法申明和實現,一步實行。
@property int age;
@property double weight;
@property NSString *name;
@end
 
@implementation Person
@end
 
int main()
{
Person *p = [Person new];
return 0;
}
 來自CODE的代碼片
property.m
 
四:id
id是一個類型,是一個萬能指針,能指向任何OC對象,至關於NSObject *
 1
 2
Person *p = [Person new];
// 等同於id p = [Person new];
 來自CODE的代碼片
id.m

id類型的定義

typedefstruct objc_object {

    Class isa;

} *id;

注:id類型後面不能加*;

NSString *_name;

->id _name;

五:構造方法

1>對象建立兩部曲

[person new]  這裏面的new完整的建立了一個可用的對象

1.分配存儲空間    (類方法) +alloc

2.初始化                (對象方法)-init

// 調用+alloc 分配存儲空間

Person *p1 = [Person alloc];

// 調用- init進行初始化

Person *p2 = [P1 init];

以上兩步能夠濃縮爲一步

Person *p3 = [[person alloc] init];

-init方法就是構造方法

2>構造方法

構造方法就是用來初始化對象的方法,是個對象方法。以‘-’開頭。

初始化對象原理:

 

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
// 每一個Person對象建立出來,他的成員變量_age值爲10
// -init進行初始化,重寫-init方法,定義_age值,在@implementation中實現
- (id)init // 不肯定init類型,因此用萬能類型
{
// 1.必定要調用回super(父類)的init方法:初始化父類中聲明的一些成員變量和其餘屬性
self = [super init]; //當前對象self
 
// 2.若是對象初始化成功,纔有必要進行接下來的初始化
if(self != nil) // 當前不爲空
{
// 初始化成功
_age = 10;
}
// 3.返回一個已經初始化完畢的對象
return self;
}
 來自CODE的代碼片
init.m
簡化方法:

 

 

 1
 2
 3
 4
 5
 6
 7
 8
- (id)init
{
if(self = [super init])
{
_age = 10;
}
return self;
}
 來自CODE的代碼片
init1.m
重寫構造方法的目的:爲了讓對象建立出來,成員變量就會有一些固定的值。

 

重寫構造方法的注意點:

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

2.再進行子類內部成員變量的初始化。

相關文章
相關標籤/搜索