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>点语法的本质

 

**其实点语法的本质还是方法调用

 

**当使用点语法时,编译器会自动展开成相应的方法

3>死循环注意

 

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
- (void) setAge:(int)age
{
// 下面的代码会引发死循环
self.age = age;
}
- (int) age
{
// 下面的代码会引发死循环
return self.age;
}
 来自CODE的代码片
死循环.m

 

 

二:成员变量的作用域

局部变量,全局变量都有自己的作用域。成员变量也有自己的作用域。

1>作用域类型

 

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.再进行子类内部成员变量的初始化。

posted @ 2015-05-18 13:40  --------  阅读(155)  评论(0编辑  收藏  举报