iphone self--内存管理

Autosar MCAL-S32k324 Crypto配置-基于EB NXP官网提供了免费的HSE固件,同时也提供了对应的协议栈。本文以算法为例,介绍MCAL相关的配置及在代码中的集成与使用。使用HSE计算,比软件算法确实方便许多。后面会完善更多的算法测试。 阅读详情

关于self.用法的一些总结

时间: 2010-10-15 16:37

我们经常会在官方文档里看到这样的代码: MyClass.h [ / lang ] @interface MyClass : NSObject { MyObject * myObject; } @property ( nonatomic, retain ) MyObject * myObject; @end MyClass.m @synthesize myObject; - ( id ) init { if

我们经常会在官方文档里看到这样的代码:
MyClass.h

[/lang]

@interface MyClass : NSObject {

    MyObject *myObject;

}

@property (nonatomic, retain) MyObject *myObject;

@end

 

MyClass.m

 

@synthesize myObject;

 

-(id)init{

    if(self = [super init]){

        MyObject * aMyObject = [[MyObject alloc] init];

        self.myObject = aMyObject;

        [aMyObject release];

    }

    return self;

}

有人就问, 为什么要这么复杂的赋值? 为什么要加self. ? 直接写成self.myObject = [[MyObject alloc] init];不是也没有错么? 不加self有时好像也是正常的? 现在我们来看看内存管理的内容:

  先看间接赋值的:

    1.加self.:

 

        MyObject * aMyObject = [[MyObject alloc] init]; //aMyObject retainCount = 1;

        self.myObject = aMyObject; //myObject retainCount = 2;

        [aMyObject release];//myObject retainCount = 1;

 

    2. 不加self.:

 

       MyObject * aMyObject = [[MyObject alloc] init]; //aMyObject retainCount = 1;

        myObject = aMyObject; //myObject retainCount = 1;

        [aMyObject release];//对象己经被释放 

 

再看直接赋值的:

    3.加self.:

 

self

.myObject

= [[

MyObject

alloc] init]

;

//myObject retainCount = 2;

 

    4. 不加self.:

 

        myObject = [[MyObject alloc] init]; //myObject retainCount = 1;

 

现在是不是有点晕, 我们先来把代码改一下, 官方的一种常见写法:

MyClass.h

 

@interface MyClass : NSObject {

    MyObject * _myObject;

}

@property (nonatomic, retain) MyObject *myObject;

@end

 

MyClass.m

  @synthesize myObject = _myObject; 

OK, 你现在再试下, 如果你用self._myObject = aMyObject; 或者 myObject = aMyObject; 你会得到一个错误, 为什么呢, 这里就是和Obj-c的存取方法有关了. 说白了很简单 , 大家都知道, @property (nonatomic, retain) MyObject *myObject; 是为一个属性设置存取方法, 只是平时我们用的方法名和属性名是一样的,现在你把它写成不同的名字, 就会很清楚了. _myObject是属性本身, myObject是存取方法名.

现在我们知道self.是访问属性的存取方法了, 那存取方法又怎么工作的? self.myObject = [[MyObject alloc] init]; 为什么会有内存泄露?

关于nonatomic我不多解释了, 它不是我要讲的重点, 而且我也没完全搞清楚, 不误导大家. 我只说assign, retain ,copy.

get方法是:

 

-(MyObject*)myObject{

    return _myObject;

}

 

Set方法是:

 

// assign 

-(void)setMyObject:(id)newValue{

    _myObject = newValue; 

}

// retain 

-(void)setMyObject:(id)newValue{

    if (_myObject != newValue) { 

        [_myObject release]; 

        _myObject = [newValue retain]; 

    }  

}

// copy 

-(void)setMyObject:(id)newValue{

    if (_myObject != newValue) { 

        [_myObject release]; 

        _myObject = [newValue copy]; 

    } 

}

 

其实这些方法里还有别的内容, 并不只是这些. 而且这些方法可以被重写. 比如你写一个

 

-(MyObject*)myObject{

 

    return _myObject;

}

 

放在你的类里, 你调用self.myObject时(不要把它放在等号左边, 那会调用get方法)就会调用这个方法.

这里多说一句, @property 是为你设置存取方法, 和你的属性无关, 你可以只写一句

 

@property (readonly) NSString *name;

 

在你的类里实现

 

-(NSString*)name{

    NSLog(@"name");

    return @"MyClass";

}

 

同样可以用self.name调用.

现在回头 说说我们开始的那四个赋值, 当不用self.的时候,  那句话只是一般的赋值, 把一个指针赋给另一个指针, 不会对分配的内存有任何影响, 所以2中不要最后[aMyObject release];这句话和4是一回事. 这里就不多说了.我们看看1和3,
当调用 setMyObject:方法时, 对newValue 做了一次retain操作, 我们必须把原来的newValue释放掉, 不然就会内存泄露, 在1里, 我们有个aMyObject可以用来释放, 在3里, 我们无法释放它, 所以, 在3里, 我们会多出来一个retainCount. 内存泄露了.

说了这么多, 我只想让大家清楚, 什么是调用属性本身, 什么是调用存取方法. 怎么样才能避免内存泄露, 而且, 以上例子里是在自己类里的调用, 如果这个类被别的类调用时, 更要注意一些,

顺便说一下, 如果你想在其它类访问对象属性, 而不是通过存取方法, 你可以用myClass -> myObject来访问, 这样是直接访问对象本身, 不过你先要把myObject设成@public. 但这个是官方不提倡的,

代码比较简单, 我还是发出来, 高人们可以忽略了 附件:  SelfExample.zip (18 K)

手把手教你学PCIE(10.5)--PCIE故障排除方法的分步排查法介绍 通过以上分步排查法,你可以系统地诊断和解决 PCIe 设备的故障。每个步骤都有助于逐步缩小问题范围,最终找到并解决问题。 阅读详情

相关推荐

win11本地部署openclaw实操第5集-X11图形化界面搭建,让WSL2“看见”世界

本文介绍了在WSL2中实现图形界面(GUI)的方法。由于WSL2默认没有图形界面,需要使用X11服务器作为"翻译显示器",将Linux程序的图形指令渲染到Windows窗口中。推荐使用VcXsrv作为X11服务器,详细说明了其安装和配置步骤,包括选择"One large window"显示模式、禁用访问控制等关键设置。随后在Ubuntu中安装轻量级xfce4桌面环境,并通过设置DISPLAY环境变量将图形输出指向VcXsrv。最终通过startxfce4命令成功在Vc

weixin_44626085的博客 811

关于self.用法的一些总结

<br />我们经常会在官方文档里看到这样的代码:<br />MyClass.h[/lang]@interface MyClass :NSObject{ MyObject *myObject; }@property(nonatomic, retain) MyObject *myObject; @end  <br />MyClass.m  @synthesize myObject;   -(id)init{if(self=[super init]){ MyObject

小胖子吃辣肉面的专栏 929

视觉SLAM十四讲--第13讲 实践:设计SLAM系统(最详细的代码调试运行步骤)

最详细的代码调试运行避坑说明,也包含了我自己对代码的理解,如有理解错误的地方,欢迎指正交流。

记录和分享 1万+

this和self区别

this,self,parent 三个关键字从字面上比较好理解,分别 是指这、自己、父亲。 this 是指向当前对象的指针 self 是指向当前类的指针 parent 是指向父类的指针 总结 this 是指向对象实例的一个指针 self 是对类本身的一个引用 parent 是对父类的引用 ...

H_c_l的博客 1116

[官方培训]07-UE材质基础 孙丹璐 Epic 笔记

勾选允许自定义深度写入再在模型上勾选然后可以通过Scene Texture节点拿到渲染的自定义深度信息,有了自定义深度信息就可以与当前渲染的像素深度进行对比,自定义深度信息存放的是最靠近我们的深度,如果当前像素离自定义深度比较远我们就不要这个像素。效果如下这种方案的缺点也很明显,因为这样看不到第二层的透明了,如果是两层的半透明的裙摆,这样就看不到第二层的裙摆了。对于半透明排序问题最根本能解决的还是光线追踪,ue5中又加入了OIT(基于像素的排序)。官方透明材质的理解和应用。

Tcohneyn的博客 1562

Windows/Mac/Linux三系统保姆级教程:用llama.cpp将safetensors模型转gguf格式(附常见错误解决)

本文提供Windows、Mac和Linux系统下使用llama.cpp将safetensors模型转换为gguf格式的详细教程,涵盖环境配置、转换原理及常见错误解决方案。通过跨平台兼容性处理,帮助开发者高效完成模型格式转换,优化边缘计算性能。

weixin_29227425的博客 270

PyQt5开发的数据编辑器(一)

一直在做游戏服务器的开发工作, 很多时候都要与数据打交道, 很多数据都是手动修改, 费时间也不易维护, 一直想写一个工具一键导出游戏数据, 不知从何写起, 恰好现在新开发游戏, 开发新游戏的同时, 也写一个简简单单的数据导出工具. 本次使用的主要语言是Python, 导出语言是后端的Lua表, 以及前端的Json数据, 为了方便策划修改数据, 数据来源主要是Excel, 后期可能会做成数据库, 但从效率上来看, 还是Excel方便些. 首先安装Python, 推荐使用最新版3.9, 由于很多库(例如pa

Ծ‸Ծ的博客 1666

电子电器架构刷写方案——General Flash Bootloader

### 文章大体有如下内容: ### 1、简介 ### 2、刷写系统概述 ### 3、Flash Bootloader刷写流程 ### 4、Flash Bootloader架构介绍 ### 5、关于刷写的思考

Soly_kun的博客 2211

pyqt5 创建一个组件,self参数什么时候用

学过python的同学,肯定都知道,python里头的类的方法,第一个参数都是self表示当前类的某个实例,然后pyqt5在创建一个组件的时候,似乎所有的构造器都会有一个parent的参数。 所以这个时候问题就来了:parent到底要不要给他赋值,赋值什么呢。 答案是: 当创建的这个组件是属于这个self的直接子组件,就要给他赋值,赋值内容就是self。否则就不赋值放空。 下面举个例子: ...

wltsysterm的博客 3990

【2022】人工智能☆✨

1. 朴素⻉叶斯⽅法是⼀种 ( ) ⽅法。A.机器学习的分类B.不确定性推理C.知识表示答案:A解析:朴素贝叶斯分类器是基于贝叶斯定理与特征条件独立假设的分类方法。它通过学习训练数据集来预测未知数据的类别标签,因此属于机器学习中的监督学习分类方法。选项B不确定性推理和选项C知识表示虽然与朴素贝叶斯方法有一定的关联,但它们并不是朴素贝叶斯方法的主要应用领域或定义特性。2. 关于启发式搜索描述正确的是 ( )。

super_mochi1 391

堆一呼一吸之间:动态扩缩容引发JVM堆内存震荡的伸缩算法、代际传导与容器定容解析

Kubernetes扩容后,新Java实例的GC频率常比老实例高出数倍,堆容量反复伸缩。本文从一次支付系统的GC陡增出发,结合HotSpot源码与JDK 8实测,拆解堆伸缩的记账规则:期望容量以GC后已用量为基数、以Xms为下限,按空闲比例判断扩缩,收缩只在老年代回收后按0%、10%、40%、100%步进;再剖析年轻代随老年代联动、晋升风暴与元空间触发线,对比Parallel、G1、ZGC等收集器及JDK 26的变化,讨论容器分账、HPA共振与原地扩缩容,最后给出分级定容、预热与监控的方案。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 15万+

学习pyqt 继承中self的疑问

前面学习了,面对对象编程,继承,有了一些理解。继续学习pyqt5 看到下面有了一些疑问。 import sys from PyQt5.QtWidgets import QApplication, QWidget from PyQt5.QtGui import QIcon class Example(QWidget): def __init__(self): ...

f的博客 4734

【YOLO26创新改进】TGRS 2026 | Transformer变体改进篇 | 使用CGTA曲率引导令牌注意力,改善结构与纹理的整体协调,适合遥感小目标检测、旋转目标检测、实例分割任务

本文在YOLO26目标检测模型中引入CGTA曲率引导令牌注意力模块,依据曲率显著性与特征可靠性,从高分辨率特征图中筛选少量关键令牌,再让全部位置与这些代表性特征进行全局交互,从而以较低计算和显存开销建立远距离目标、背景及跨尺度结构之间的联系;该模块能够重点强化车辆、舰船、飞机、建筑等目标的边缘、转角和弯曲轮廓,改善小目标、密集目标及旋转目标的特征完整性与定位稳定性,并通过可靠性门控抑制噪声和伪边缘,通过标准注意力与曲率注意力融合避免平坦区域被过度增强。

AI魔改博士-中大博士 46

iphone关于self.用法的一些总结

关于什么时间用self. , 其实是和Obj-c的存取方法有关, 不过网上很多人也都这么解答的, 那它为什么和存取方法有关? 怎么有关的? 并没有多少人回答出来. 同时关于内存管理的内容, 请大家看旺财勇士的Objective-C内存管理总结~CC专版 , 有些东西我就不多解释了.   进入正题, 我们经常会在官方文档里看到这样的代码:  MyClass.h  [/lang]  @inte...

weixin_30326515的博客 109

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

iphone self. 属性的用法

<br /> 关于什么时间用self. , 其实是和Obj-c的存取方法有关, 不过网上很多人也都这么解答的, 那它为什么和存取方法有关? 怎么有关的? 并没有多少人回答出来. 同时关于内存管理的内容, 请大家看旺财勇士的Objective-C内存管理总结~CC专版 , 有些东西我就不多解释了. <br />   进入正题, 我们经常会在官方文档里看到这样的代码: <br />  MyClass.h <br />  [/lang] <br />  @interface MyClass : NSObject

link的专栏 3102

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

IOS关于SELF点的一些事情

主要参考文章:http://blog.sina.com.cn/s/blog_a263f0c601010qj9.html 橙色字体为自己标注的的内容,方便加深印象 IPHONE开发SELF的用法 关于什么时间用self. , 其实是和Ob...

chuhuangqiao1461的博客 117

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

iPhone开发之self.的用法

关于什么时间用self. , 其实是和Obj-c的存取方法有关, 不过网上很多人也都这么解答的, 那它为什么和存取方法有关? 怎么有关的? 并没有多少人回答出来. 同时关于内存管理的内容, 请大家看旺财勇士的Objective-C内存管理总结~CC专版 , 有些东西我就不多解释了。 进入正题, 我们经常会在官方文档里看到这样的代码: MyClass.h @interface MyClas

strliu的专栏 490

iphone开发self的用法

关于什么时间用self. , 其实是和Obj-c的存取方法有关, 不过网上很多人也都这么解答的, 那它为什么和存取方法有关? 怎么有关的? 并没有多少人回答出来. 同时关于内存管理的内容, 请大家看旺财勇士的Objective-C内存管理总结~CC专版 , 有些东西我就不多解释了.     进入正题, 我们经常会在官方文档里看到这样的代码:    MyClass.h    [/lang]

566

iPhone开发self的用法

关于什么时间用self. , 其实是和Obj-c的存取方法有关, 不过网上很多人也都这么解答的, 那它为什么和存取方法有关? 怎么有关的? 并没有多少人回答出来. 同时关于内存管理的内容, 请大家看旺财勇士的Objective-C内存管理总结~CC专版 , 有些东西我就不多解释了.     进入正题, 我们经常会在官方文档里看到这样的代码:    MyClass.h    [/lang]

鹰击长空 582

iphone下self用法

http://blog.163.com/zyc-to/blog/static/17152400201112262011315/ 关于什么时间用self. , 其实是和Obj-c的存取方法有关, 不过网上很多人也都这么解答的, 那它为什么和存取方法有关? 怎么有关的? 并没有多少人回答出来. 同时关于内存管理的内容, 请大家看旺财勇士的Objective-C内存管理总结~CC专版 , 有些东

fg313071405的专栏 450

iphone ios 关于self和下划线总结

原文地址:http://www.cocoachina.com/bbs/read.php?tid-12850-toread-1-page-1.html 关于什么时间用self. , 其实是和Obj-c的存取方法有关, 不过网上很多人也都这么解答的, 那它为什么和存取方

7156

ios开发self的用法

IPHONE开发SELF的用法 关于什么时间用self. , 其实是和Obj-c的存取方法有关, 不过网上很多人也都这么解答的, 那它为什么和存取方法有关? 怎么有关的? 并没有多少人回答出来. 同时关于内存管理的内容, 请大家看旺财勇士的Objective-C内存管理总结~CC专版 , 有些东西我就不多解释了.     进入正题, 我们经常会在官方文档里看到这样的代码:

code life 523

ios中self.用法

IPHONE开发SELF的用法 关于什么时间用self. , 其实是和Obj-c的存取方法有关, 不过网上很多人也都这么解答的, 那它为什么和存取方法有关? 怎么有关的? 并没有多少人回答出来. 同时关于内存管理的内容, 请大家看旺财勇士的Objective-C内存管理总结~CC专版 , 有些东西我就不多解释了.     进入正题, 我们经常会在官方文档里看到这样的代码:

Xcocode_ios的专栏 489

[转Iphone]关于self.用法的一些总结

<br /> <br />MyClass.h  @interface MyClass :NSObject{ MyObject * _myObject; }@property(nonatomic, retain) MyObject *myObject; @end  <br />MyClass.m<br />  @synthesize myObject = _myObject; <br />OK, 你现在再试下, 如果你用self._myObject = aMyObject; 或者 myObj

wangbofei的专栏 807
上一篇: IPHONE COCOAS-2D
下一篇: [系统控件重绘教程(二)]重绘NSButton
皓浩
博客等级 码龄18年 157粉丝 121原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值