美文网首页
Lesson 0-1 Objective-C basic

Lesson 0-1 Objective-C basic

作者: 快乐捣蛋鬼 | 来源:发表于2019-08-07 14:58 被阅读0次

    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
    
    

    相关文章

      网友评论

          本文标题:Lesson 0-1 Objective-C basic

          本文链接:https://www.haomeiwen.com/subject/cobodctx.html