Lesson 0-1 Objective-C basic

6.OC 手动内存管理

OC 内存管理原则:

  • 只要使用 alloc, new, copy, mutableCopy, retain 开头的方法将一个对象的地址赋给一个指针变量时,该对象指针就拥有这个对象的绝对使用权,使用后,就要进行 releaseautorelease来释放对象。(在MRC环境下要注意-手动内存管理)
    控制ARC的开关
  • 对象的内存空间是由程序员手动分配的,在使用完之后,在MRC环境之下,就需要手动进行释放,如果不及时释放就会造成内存泄漏,如果一个对象已经被释放/销毁,再去使用这个对象所使用的内存空间就会造成崩溃。
// Person.m

#import "Person.h"

@implementation Person

-(void)dealloc
{
    [super dealloc];
}

// 内存管理实例方法
-(void)work
{
    NSLog(@"%@在工作", _name);
}


@end


  • dealloc: 为了检测到当前类的对象什么时候被销魂,需要重写dealloc方法,这个方法默认父类来实现,在销毁之前,要由父类来做一些工作,每当调用dealloc的时候,这个对象就已经被销毁了,所以NSLog打印要放在[super dealloc] 的前面。如果放在后面就会造成访问已经被销毁的对象,造成崩溃。
#import "ViewController.h"
#import "Person.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    
    
    // 实例化 Person

    Person *person = [Person new];
    [person work];
    
    [person release];  // Attention: release
    
    
}

@end

通过打印NSLog(@"%lu", person.retainCount)可以知道是否被销毁(0/1)
每当出现 alloc, new, copy, mutableCopy, retain就会导致引用+1,就要用release或者autorelease-1

访问僵尸对象

zombieObject检测

不用看了,因为下面有自动内存管理哈

7.OC 自动内存管理

  • ARC环境下,在使用dealloc方法时,不要手动调用[super dealloc];,系统会自动调用,手动调用会出错
  • ARC情况下,默认Strong指针。
    当使用一个强指针指向一个对象时,就会引用计数+1,这个指针就有了这个对象的绝对使用权。如果没有任何强指针指向这个对象时,对象就被立即销毁
// Person.h
-(void)dealloc
{
    [super dealloc];
}

8.OC 的set和get方法

用属性生成器生成的不需要set和get方法,会自动生成set和get方法。

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface Person : NSObject
// 声明 3 个属性,用属性生成器生成的不需要set和get方法,会自动生成set和get方法。
@property(nonatomic, strong)NSString *name;
@property(nonatomic, assign)NSUInteger age;
@property(nonatomic, strong)NSString *gender;

// 声明 3 个 set 方法
-(void)setName:(NSString * _Nonnull)name;
-(void)setAge:(NSUInteger)age;
-(void)setGender:(NSString * _Nonnull)gender;

// 声明 3 个 get 方法
-(NSString *)name;
-(NSUInteger)age;
-(NSString *)gender;


@end

NS_ASSUME_NONNULL_END

// Person.m
#import "Person.h"

@implementation Person


// 实现 3 个 set 方法
- (void)setName:(NSString *)name
{
    self.name = name;
    
}

-(void)setAge:(NSUInteger)age
{
    self.age = age;
}

-(void)setGender:(NSString *)gender
{
    self.gender = gender;
}

// 实现 3 个 get 方法
- (NSString *)name
{
    return _name;
}
- (NSUInteger)age
{
    return _age;
}
-(NSString *)gender
{
    return _gender;
}


// 为了打印更多的信息,重写description
-(NSString *)description
{
    return [NSString stringWithFormat:@"name = %@, age = %zd, gender = %@", _name, _age, _gender];
}
@end

9.OC点语法

方便完成赋值和取值操作

[person setName:@"Tom"];
person.name = @"Tim";                         

10.属性约束

  • 线程安全相关(原子性)
    • atomic(原子操作)(默认)
    • nonatomic(非原子操作),一般情况下,都使用nonatomic,可以提高程序的执行效率
  • 内存管理相关
    • MRC下,retain(强引用),copy(强引用),assign(弱引用,赋值,默认)
    • ARC下,strong(强引用), weak(弱引用),copy(强引用),assign(弱引用,赋值,默认)
  • 读写属性相关
    • readwrite(同时生成setter和getter方法)(默认)
    • readonly(只会生成getter方法)
  • 重命名相关
    • setter方法重命名,方法名称后必须附带一个;
    • getter方法重命名
// example
@property (nonatomic, strong) NSString *name; // NSObject对象需要strong/weak
@property (nonatomic, assign) NSUInteger age; // 基本数值类型用assign

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。