前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS 程序内存指针和对象的理解

iOS 程序内存指针和对象的理解

作者头像
星宇大前端
发布2019-01-15 15:31:59
9030
发布2019-01-15 15:31:59
举报
文章被收录于专栏:大宇笔记

最近对指针和内存有产生了浓厚的兴趣,然后就想研究一下iOS 程序指针内存对象这些东西都是怎么关联在一起的呢,又是怎么工作的呢。

一、指针

首先先说一下指针:

        弄懂指针对以后编程效率有大大滴帮助,大学第一个编程语言C语言,两节C语言指针我一直记忆犹新。云里雾里,那时候我就知道指针是个好东西,但我控制不住它,它会给我惹好多麻烦。

        指针是其实也是一个对象,它指向一个内存地址单元,内存单元里存着各种变量。这样指针就可以指向这样变量,当我们用的时候我们就可以从内存单元取出变量内容。

        百度百科的比喻我感觉很恰当,如果电脑的存储器相当于一本书,那么指针就像粘在每一页的页码,想要哪页的内容直接找页码直接就会找到。

二、强引用 弱引用

 先说下OC中强引用和弱引用的概念然后再举一个�说明。

 强引用:一个指针对象持有一个内存地址,内存地址是跟强引用的那个指针共存亡的。指针就像风筝的线,如果这个指针不指向了这个内存地址,风筝就会飞走了,内存地址就会被存储器干掉。

弱引用:指针指向内存地址,但并没有共存亡的关系。内存单元并不会因为指针的释放,同理内存单元被干掉了之后指针还是会指向该地址。(这就是所谓的野指针)

感觉这个例子很能表达出这个意思:

代码语言:javascript
复制
//
//  main.m
//  ARC中的强引用和弱引用
//
//  Created by on 15/3/31.
//  Copyright (c) 2015年 apple. All rights reserved.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        id __weak obj0 = nil;
        if (YES) {
            id obj1 = [[NSObject alloc] init];
            obj0 = obj1;
            NSLog(@"obj0: %@", obj0);
        }
        NSLog(@"obj0: %@", obj0);
    }
    return 0;
}

/*
 *  输出结果
 *  obj0: <NSObject: 0x1003066c0>
 *  obj0: (null)
 *
 *  因为obj1生成的默认的为强引用(__strong),在超出if的作用域之后,obj1所持有的对象被释放,
 *  obj0为弱引用,所以obj0不持有对象,在obj1对象释放后,obj0自动的被赋值为nil
 *  弱引用的特性是,不持有对象,即便是写成id __weak obj1 = [[NSObject alloc] init];
 *  此代码系统会给与警告,因为这里obj1被声明成弱引用,那么在赋值之后,alloc出来的对象会被立即释放。
 */

三、@property的修饰属性

1.atomic与nonatomic atomic:默认是有该属性的,这个属性是为了保证程序在多线程情况,编译器会自动生成一些互斥加锁代码,避免该变量的读写不同步问题。 nonatomic:如果该对象无需考虑多线程的情况,请加入这个属性,这样会让编译器少生成一些互斥加锁代码,可以提高效率。

2.readwrite与readonly readwrite:这个属性是默认的情况,会自动为你生成存取器。 readonly:只生成getter不会有setter方法。 readwrite、readonly这两个属性的真正价值,不是提供成员变量访问接口,而是控制成员变量的访问权限。

3.strong与weak strong:强引用,也是我们通常说的引用,其存亡直接决定了所指向对象的存亡。如果不存在指向一个对象的引用,并且此对象不再显示在列表中,则此对象会被从内存中释放。 weak:弱引用,不决定对象的存亡。即使一个对象被持有无数个弱引用,只要没有强引用指向它,那么还是会被清除。 strong与retain功能相似;weak与assign相似,只是当对象消失后weak会自动把指针变为nil;

4.assign、copy、retain assign:默认类型,setter方法直接赋值,不进行任何retain操作,不改变引用计数。一般用来处理基本数据类型。 retain:释放旧的对象(release),将旧对象的值赋给新对象,再令新对象引用计数为1。我理解为指针的拷贝,拷贝一份原来的指针,释放原来指针指向的对象的内容,再令指针指向新的对象内容。 copy:与retain处理流程一样,先对旧值release,再copy出新的对象,retainCount为1.为了减少对上下文的依赖而引入的机 制。我理解为内容的拷贝,向内存申请一块空间,把原来的对象内容赋给它,令其引用计数为1。对copy属性要特别注意:被定义有copy属性的对象必须要 符合NSCopying协议,必须实现- (id)copyWithZone:(NSZone *)zone方法。 也可以直接使用:     使用assign: 对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char, 等等)     使用copy: 对NSString     使用retain: 对其他NSObject和其子类

5.getter setter getter:是用来指定get方法的方法名 setter:是用来指定set访求的方法名 在@property的属性中,如果这个属性是一个BOOL值,通常我们可以用getter来定义一个自己喜欢的名字,例如: @property (nonatomic, assign, getter=isValue) boolean value; @property (nonatomic, assign, setter=setIsValue) boolean value;

四、深拷贝和浅拷贝

浅拷贝:我自己的理解是指针拷贝,指向单元地址不拷贝。

深拷贝:即内存地址的拷贝,拥有新的单元地址,内容为原来内存单元的内容。(必须实现NSCopying 里copyWithZone)

别用字符串测试,自己写一个类测试。。字符串真是个奇怪的对象,观察不了他的逻辑。

retain strong 都是浅拷贝

copy是深拷贝

代码语言:javascript
复制
#import <Foundation/Foundation.h>

@interface copyObj : NSObject<NSCopying>

@end
代码语言:javascript
复制
#import "copyObj.h"

@implementation copyObj


-(id)copyWithZone:(NSZone *)zone{
    copyObj  * copyZone  =[[self class] allocWithZone:zone];
    return copyZone;
}

@end
代码语言:javascript
复制
#import <UIKit/UIKit.h>
#import "copyObj.h"

@interface ViewController : UIViewController

@property(nonatomic,copy)copyObj *  a;
@property(nonatomic,strong)copyObj *  b;

@end
代码语言:javascript
复制
    copyObj  *  c = [[copyObj alloc]init];
    NSLog(@"%p--%x",c,&c);
    self.a=c;
    NSLog(@"%p--%x",_a,&_a);
    self.b=c;
    NSLog(@"%p--%x",_b,&_b);

结果如下:

2017-02-25 17:14:09.324 test[14251:807504] 0x60800000da40--5267bae8

2017-02-25 17:14:09.325 test[14251:807504] 0x60800000dae0--be6066b8

2017-02-25 17:14:09.325 test[14251:807504] 0x60800000da40--be6066c0

本文是自己的理解。错误之处希望指正。

参考:https://www.lvtao.net/ios/504.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年02月25日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档