使用self. 导致的内存泄露

本文深入解析了Objective-C中的对象赋值方式及其对内存管理的影响,通过对比示例代码,揭示了内存泄露的原因及预防方法。
请看第一段代码:
在MyObject.m中
self.aObj = [[NSObject alloc] init];
...
...
- (void)dealloc{
        [self.aObj release];
        [super dealloc];
}
你能否看出这里的内存泄露?
接下来看第二段:
aObj = [[NSObject alloc] init];
...
...
- (void)dealloc{
        [aObj release];
        [super dealloc];
}
你能否看出这里是否也有内存泄露呢?
如果你都能够很确定的知道泄露的原因,那么下面的文字,你就不需要阅读了,找个养眼的图片,养养眼吧。相反,如果你不确定,那么,下面的内容就对你很有帮助。
首先给没看出来的同学普及@property生成的set和get方法的具体内容:
- (NSObject *)aObj{
        return aObj;
}
- (void)setAObj:(NSObject *)newobj{
       if(newobj != aObj){
               [aObj release];
               aObj = [newobj retain];
       }
}
现 在,将第一段代码,带入到这个set方法中去,你就能发现 self.aObj = [[NSObject alloc] init];是一个永远不会被释放的对象,aObj这个对象所对应的指针在alloc的时候被retain了一次retainCount=1,在set方 法中又被retain了一次,所以retainCount=2,在dealloc方法中,只有一次release,所以,retainCount=1,这 个指针空间就不会被释放,而第二段代码中,并没有使用set方法,而是将 [[NSObject alloc] init];的指针付值给aObj这个变量。只有一次alloc。故在程序执行dealloc方法的时候,这个指针空间就可以被释放。
 
下面给大家一段正确使用和释放self.的例子
NSObject *newobj = [[NSObject alloc] init];
self.aObj = newobj;
[newobj release];
...
...
- (void)dealloc{
        self.aObj = nil;//这样写显的很简洁
        [super dealloc];
}
 
对于@property([copy|assign])这两种情况,大家可以参考这个链接的文章。
http://www.cocoachina.com/macdev/cocoa/2010/1015/2194.html
from PySide6 import QtWidgets, QtCore, QtGui from PyQt5.QtGui import QImage, QPixmap import cv2, os, time from threading import Thread import numpy as np from ultralytics import YOLO class MWindow(QtWidgets.QMainWindow): def __init__(self): super().__init__() # 设置 UI 界面 self.setupUI() # 连接按钮 self.camBtn.clicked.connect(self.startCamera) self.videoBtn.clicked.connect(self.startVideoFile) self.imagesBtn.clicked.connect(self.startImagesFile) self.stopBtn.clicked.connect(self.stop) self.camComboBox.currentIndexChanged.connect(self.switchCamera) self.selectWeightBtn.clicked.connect(self.selectWeightFile) # 定时器 self.timer_camera = QtCore.QTimer() self.timer_camera.timeout.connect(self.show_camera) self.timer_videoFile = QtCore.QTimer() self.timer_videoFile.timeout.connect(self.show_videoFile) self.timer_imagesFile = QtCore.QTimer() self.timer_imagesFile.timeout.connect(self.show_imagesFile) # 处理帧的队列 self.frameToAnalyze = [] Thread(target=self.frameAnalyzeThreadFunc, daemon=True).start() # 其他参数 self.cap = None self.cameras = [] self.current_camera_idx = -1 self.stopFlag = False self.vframeIdx = 0 self.model = None # 在此处初始化为空,等待选择权重文件 def load_model(self, weightPath): """加载自定义训练的 YOLO 权重文件""" if not weightPath: QtWidgets.QMessageBox.warning(self, "错误", "未选择权重文件,程序将退出") exit() try: # 使用 ultralytics.YOLO 加载权重文件 self.model = YOLO(weightPath) self.textLog.append(f"✅ 成功加载权重: {weightPath}") except Exception as e: QtWidgets.QMessageBox.critical(self, "模型加载失败", f"错误信息: {str(e)}") exit() def setupUI(self): """设置界面""" self.resize(1060, 600) self.setWindowTitle('YOLO-Qt 目标检测') mainLayout = QtWidgets.QVBox
03-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值