1    封装
封装指的是將对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法对内部信息的操作和访问。OC的封装特性需要通过使用访问控制符来实现。

#import <Foundation/Foundation.h>

@interface Sturent : NSObject
{
    int _age;
    double _weight;
}
-(void) test;
-(void) setAge:(int)NewAge;
-(int)age;

-(void) setWeight:(double)NewWeight;
-(double)_weight;
@end

@implementation Sturent

-(void) setAge:(int)NewAge
{
    if (NewAge<=0)
    {
        NewAge=1;
    }
    
    _age = NewAge;
}
-(int)age
{
  return _age;
}
-(void)setWeight:(double)NewWeight
{
    _weight = NewWeight;
}
-(double)_weight
{

    return _weight;
}

-(void) test
{
    NSLog(@"年龄为%d体重为%f的学生在学习",_age,_weight);
}

@end


int main()
{
    Sturent *stu = [Sturent new];
    
    [stu setAge:23];
    [stu setWeight:75.2];
    
    [stu test];
}

  


1.1    访问控制符
1、@private:当前类访问权限。如果类的成员变量使用@private访问控制符来限制,则这个成员变量只能在当前类的内部被访问。这个访问控制符用于彻底隐藏成员变量。在类的实现部分定义的成员变量相当于默认使用这种访问权限。
2、@package:框架类访问权限。如果类的成员变量使用@package访问控制符来限制,则当前类或者同一框架中的其他类能够访问这个成员变量。这个访问控制符用于部分隐藏成员变量。
3、@protected:子类访问权限。如果类的成员变量使用@protected访问控制符来限制,则当前类或者其子类能够访问这个成员变量。这个访问控制符用于部分隐藏成员变量。
4、@public:公共访问权限。如果类的成员变量使用@public访问控制符来限制,则所有的类都能够访问这个成员变量。这个访问控制符用于彻底暴露成员变量,一般不建议这么做。
1.2    set和get方法
类里面的绝大部分成员变量应该使用@private进行限制,提供set和get方法访问该成员变量。
set方法
1.作用: 提供一个方法给外界设置成员变量值,可以在方法里面对参数进行相应过滤
2.命名规范:
1> 方法名必须以set开头
2> set后面跟上成员变量的名称,成员变量的首字母必须大写
3> 返回值一定是void
4> 一定要接收一个参数,而且参数类型跟成员变量类型一致
5> 形参的名称不能跟成员变量名一样
get方法
1.作用:返回对象内部的成员变量
2.命名规范:
1> 肯定有返回值,返回值类型肯定与成员变量类型一致
2> 方法名跟成员变量名一样
3> 不需要接收任何参数

#import <Foundation/Foundation.h>

typedef enum {
    SexMan,
    SexWoman
}Sex;


@interface Person : NSObject
{
    int _age;
    Sex _sex;
}
// age的set和get方法
- (void)setAge:(int)age;
- (int)age;

// sex的set和get方法
- (void)setSex:(Sex)sex;
- (Sex)sex;

@end

@implementation Person


- (void)setAge:(int)age
{
    _age = age;
}
- (int)age;
{
    return _age;
}

- (void)setSex:(Sex)sex
{
    _sex = sex;
}

- (Sex)sex
{
    return _sex;
}

@end


int main()
{
    Person *p = [Person new];
    [p setAge:23];
    [p setSex:SexMan];
    
    [p age];
    [p sex];
    
    return 0;
}