OC----面向对象

时间:2023-03-09 09:39:31
OC----面向对象

创建一个类

comm+n

实例变量的可见度 @public,@protect@private

@public  // 共有的,在类的内部和外部都可以进行访问

@protected   // 受保护的,在类的内部和子类中可以进行访问,实例变量默认是受保护的

@private   // 私有的,只能在类的内部进行访问,子类中也不可以访问

OC中方法分为两类:类方法(+)和实例方法(-),其中类方法也叫做静态方法在类方法只能怪不能访问类中的实例变量

#import"Women.h"  // 循环导入
@class Women;  // 只是告诉编译器后面只是一个类,但是并没有导入类的借口部分,所以类里面有什么方法和实例变量都不知道,如果想要使用类中的方法和实例变量的时候,需要在.m中再次#import该类。这样就解决了循环导入的问题。我们一般在开发过程中使用@class,在.m里面使用#import

// 设置器
- (void)setWife:(Women *)wife;
// 访问器
- (Women *)wife;

自定义初始化(实例方法)

- (instancetype)initWithName:(NSString *)name
{
    self = [super init];
    if (self) {
        //self.name = name; // 官方不建议使用
        // _name = name;// 会造成野指针出现,因为_name没有持有传递进来的参数,如果传递进来的参数在外部被释放掉的话,那么就会造成野指针。
        _name = [name retain];
    }
    return self;
}
便利构造器 (类方法)
+ (instancetype)personinitWithName:(NSString *)name
{
    Person *person = [[self alloc] initWithName:name];
    return [person autorelease];  // 在便利构造器中,最后返回的对象后面加autorelease
}
#pragma mark - 属性语义控制是copy的内部实现
- (void)setName:(NSString *)name
{
    if (_name != name) {
        [_name release];
        _name = [name copy];
    }
}
- (NSString *)name
{
    return _name;
}
#pragma mark - 属性语义控制是retain的内部实现

- (void)setName:(NSString *)name
{
    if (_name != name) {
        [_name release];
        _name = [name retain];
    }
}
- (NSString *)name
{
    // return [[_name retain] autorelease];  // 当属性为原子性的时候(
    return _name;
}
#pragma mark - 属性语义控制是assign的内部实现

- (void)setName:(NSString *)name
{
    _name = name;
}

- (NSString *):name
{
    return _name;
}
// 重写dealloc
- (void)dealloc
{
    [_name release];  // 释放setter方法总成的内存泄露
    [super dealloc];
}