您的位置:首页 > 职场人生

黑马程序员--oc:特有语法1

2014-12-20 22:07 351 查看
一、点语法

Person.h文件

@interface Person : NSObject

{

    int _age;

    NSString *_name;

}

- (void)setAge:(int)age;

- (int)age;

 

- (void)setName:(NSString *)name;

- (NSString *)name;

@end

 

Person.m文件

 

#import "Person.h"

 

@implementation Person

 

- (void)setAge:(int)age

{

    //_age = age;

    

    NSLog(@"setAge:");

    

    // 会引发死循环

    //self.age = age; // [self setAge:age];

}

 

- (int)age

{

    NSLog(@"age");

    return _age;

    // 会引发死循环

    //return self.age;// [self age];

}

 

- (void)setName:(NSString *)name

{

    _name = name;

}

 

- (NSString *)name

{

    return _name;

}

@end

 

main.m文件

#import <Foundation/Foundation.h>

#import "Person.h"

 

int main(int argc, const char * argv[])

{

    Person *p = [Person new];

    

    // 点语法的本质还是方法调用

    p.age = 10; // [p setAge:10];

    

    int a = p.age; // [p age];

    

    

    p.name = @"Jack";

    

    NSString *s = p.name;

    

    NSLog(@"%@", s);

    

    return 0;

}

 

 

 

二、成员变量的作用域

 @public : 在任何地方都能直接访问对象的成员变量

 @private : 只能在当前类的对象方法中直接访问(@implementation中默认是@private)

 @protected : 可以在当前类及其子类的对象方法中直接访问  (@interface中默认就是@protected)

 @package : 只要处在同一个框架中,就能直接访问对象的成员变量

 

 @interface和@implementation中不能声明同名的成员变量

 

三、property和synthesize

Person.h文件

#import <Foundation/Foundation.h>

 

@interface Person : NSObject

{

    int _age;

    // int age;

    

    int _height;

    

    double _weight;

    

    NSString *_name;

}

 

// @property:可以自动生成某个成员变量的setter和getter声明

@property int age;

//- (void)setAge:(int)age;

//- (int)age;

 

 

@property int height;

//- (void)setHeight:(int)height;

//- (int)height;

 

- (void)test;

 

@property double weight;

@property NSString *name;

@end

 

Person.m文件

 

#import "Person.h"

@implementation Person

 

// @synthesize自动生成age的setter和getter实现,并且会访问_age这个成员变量

@synthesize age = _age;

 

@synthesize height = _height;

 

@synthesize weight = _weight, name = _name;

 

@end

 

1.@property

  用在@interface中

  用来自动生成setter和getter的声明 

用@property int age;就可以代替下面的两行

-(int)age;   // getter

- (void)setAge:(int)age;  //setter

示例

#import <Foundation/Foundation.h>

@inrterface Student : NSObject {

@property int age;

}

2.@synthesize

   用在@implementation中

   用来自动生成setter和getter的实现

   用@syuthesize age =  _age;就可以代替

-(int)age{

        return _age;

}

-(viod)setAge:(int)age{

        _age = age;

}

      示例

 #imoprt“Studenth”

 @implementation Student

 @synthesize age = _age;

 @end

 3. @synthesize的细节

 @synthesize age = _age

 setter和getter实现中会访问成员变量 _age

 如果成员变量 _age不存在,就会在@implementation中自动生成一个@private的成员变量 _age

 @synthesize age

 setter和getter实现中会访问成员变量age

 如果成员变量age不存在,就会自动生成一个@private的成员变量age

 手动实现

 若手动实现了setter方法,编译器就只会自动生成getter方法

 若手动实现了getter方法,编译器就只会自动生成setter方法

 若手动实现了setter和getter方法,编译器就不会自动生成不存在的成员变量

综上所述创建实例代码分析:

@propery int age;

这个代码主要有三个作用:

1> 在.h头文件中生成age的setter和getter方法的声明;

2> 在.m实现文件中生成@synthesize age = _age;然后再解析成setter和getter方法的实现。

3> 在对其第二步解析的同时,由于没有找到_age的成员变量,所以会生成_age的成员变量,再在setter和getter的实现方法中访问。

 

4.@property新特性

 自从Xcode4.4后,@property就独揽了@synthesize的功能,也就是说,@property可以同时

 生成setter和getter的声明和实现

 默认情况下,setter和getter方法中的实现,会去访问下划线 _ 开头的成员变量

 

四、万能指针

1. 简介

万能指针,能指向任何OC对象,相当于NSObject *

id类型的定义

typedef struct objc_object {

    Class isa;

} *id;

 

2. 使用

// 注意:id后面不要加上*

id p = [Person new];

 

3. 局限性

调用一个不存在的方法,编译器会马上报错

 

五、构造函数

 

1. 对象创建原理

new的拆分两部曲

分配内存(+alloc)

初始化(-init)

Person *p1 = [Person alloc];

Person *p1 = [p1 init];

合成一句后:

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

 

2. init方法的重写

想在对象创建完毕后,成员变量马上就有一些默认的值

init方法的重写过程

- (id)init

{

    if (self = [super init])

    {

        _age = 10;

    }

    return self;

}

3. 自定义构造方法

3.1构造方法的一些规范

返回值是id类型

方法名都以init开头

- (id)initWithAge:(int)age {

    if (self = [super init]) {

        _age = age;

    }

    return self;

}

3.2传递多个参数进行初始化

- (id) initWithAge:(int)age andNo:(int)no;

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  黑马程序员