兼容Arc写法

文章详细介绍了如何在使用Objective-C自动引用计数功能的同时,整合第三方库,避免ARC(自动引用计数)警告ARC forbids explicit message send of 'release'的问题。通过调整工程设置,指定特定文件不使用自动引用计数功能,实现了兼容性与内存管理的高效处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在最新版的Xcode的IPhone开发中,添加了Objective-c automatic reference count 功能,自动管理指针对象的内存管理,无需专门写相应对象声明autorelease,retain对象的释放等等。

        可是在整合新浪微博的开发过程中,发现官方提供的iOS SDK里都是自动控制对象的释放功能,会提示报错

ARC forbids explicit message send of'release'

         一种方法是关闭Objective-c automatic reference count 功能

       打开当前工程,打开"Build Settings",找到Objective-C Automatic Reference Counting项,将它的值设置为NO。

         但是这种方法的缺点就是需要自己管理对象指针的释放功能,对于不擅长c语言的程序来讲,这是有风险的。

         另一种方法是整个项目工程启用默认的Objective-C Automatic Reference Counting=yes;只是指定这些文件不需要Objective-C Automatic Reference 。

                    打开当前工程,选择 target -> Build Phases -> Compile Sources;双击指定的文件,会弹出一个小窗口,在窗口里加入:

-fno-objc-arc

 

         最好的方法是选中新浪微博这些自己管理释放对象的文件,指定他们不需要Objective-C Automatic Reference Counting;其他自己开发的代码还是继续使用Objective-C Automatic Reference 特征。

                我选择了新浪微博官方iOS SDK里的以下四个文件:

JSONKit.m
SinaWeibo.m
SinaWeiboAuthorizeView.m
SinaWeiboRequest.m

                操作结果如下:



    呵呵,到这一步;所有都编译通过,运行正常了!






(defun c:gjtx (/ *error* oldCmdEcho oldOsmode pline1 pline2 entType1 entType2 intPoints breakPoint radius breakPline otherPline breakData breakLayer breakParam distAtParam tangent normal startPoint endPoint startParam endParam paramOffset sidePoint vec1 vec2 crossProduct arcDirection arcEnt arcCenter arcData) ;; 错误处理函数 (defun *error* (msg) (if oldCmdEcho (setvar "CMDECHO" oldCmdEcho)) (if oldOsmode (setvar "OSMODE" oldOsmode)) (if (not (member msg '("Function cancelled" "quit / exit abort"))) (princ (strcat "\n错误: " msg)) ) (princ) ) ;; 保存系统变量 (setq oldCmdEcho (getvar "CMDECHO")) (setq oldOsmode (getvar "OSMODE")) (setvar "CMDECHO" 0) (setvar "OSMODE" 0) ;; 选择两条图元 (while (not (and (setq pline1 (car (entsel "\n选择第一条线或多段线: "))) (setq entType1 (cdr (assoc 0 (entget pline1)))) (member entType1 '("LINE" "LWPOLYLINE" "POLYLINE")))) (princ "\n必须选择直线或多段线!") ) (while (not (and (setq pline2 (car (entsel "\n选择第二条线或多段线: "))) (setq entType2 (cdr (assoc 0 (entget pline2)))) (member entType2 '("LINE" "LWPOLYLINE" "POLYLINE")))) (princ "\n必须选择直线或多段线!") ) ;; 获取交点 (setq intPoints (vlax-invoke (vlax-ename->vla-object pline1) 'IntersectWith (vlax-ename->vla-object pline2) acExtendNone)) (if (not intPoints) (progn (princ "\n未找到交点!") (exit) ) ) ;; 准备交点数据 (setq breakPoint (list (nth 0 intPoints) (nth 1 intPoints) (nth 2 intPoints))) (setq arcCenter breakPoint) ;; 获取半径 (initget 7) ; 不允许零和负值 (setq radius (getdist breakPoint "\n指定跳线圆弧半径: ")) ;; 确定要打断的线 (initget "1 2") (setq breakPline (getkword "\n选择要打断的线 (1=第一条/2=第二条) [1]: ")) (if (not breakPline) (setq breakPline "1")) (if (= breakPline "1") (setq breakPline pline1 otherPline pline2) (setq breakPline pline2 otherPline pline1) ) ;; 获取打断线的图层 (setq breakData (entget breakPline)) (setq breakLayer (cdr (assoc 8 breakData))) ;; 获取打断点参数 (setq breakParam (vlax-curve-getParamAtPoint breakPline breakPoint)) (setq distAtParam (vlax-curve-getDistAtParam breakPline breakParam)) (if (not (and breakParam distAtParam)) (progn (princ "\n无法确定曲线参数或距离!") (exit) ) ) ;; 计算圆弧起点和终点 (setq tangent (vlax-curve-getFirstDeriv breakPline breakParam)) (setq normal (list (- (cadr tangent)) (car tangent) 0.0)) (setq normal (mapcar '/ normal (list (distance '(0 0 0) normal) (distance '(0 0 0) normal) 1.0))) (setq startPoint (mapcar '+ arcCenter (mapcar '* (list (- radius) (- radius) 0.0) normal))) (setq endPoint (mapcar '+ arcCenter (mapcar '* (list radius radius 0.0) normal))) ;; 确保点在线上 (setq startParam (vlax-curve-getParamAtPoint breakPline startPoint)) (setq endParam (vlax-curve-getParamAtPoint breakPline endPoint)) (if (or (null startParam) (null endParam)) (progn (setq paramOffset (/ radius distAtParam)) (setq startParam (max (vlax-curve-getStartParam breakPline) (- breakParam paramOffset))) (setq endParam (min (vlax-curve-getEndParam breakPline) (+ breakParam paramOffset))) (setq startPoint (vlax-curve-getPointAtParam breakPline startParam)) (setq endPoint (vlax-curve-getPointAtParam breakPline endParam)) ) ) ;; 确定圆弧方向 (princ "\n请点击选择圆弧方向 (在要弯曲的一侧点击): ") (setq sidePoint (getpoint breakPoint)) (setq vec1 (mapcar '- startPoint breakPoint)) (setq vec2 (mapcar '- sidePoint breakPoint)) (setq crossProduct (- (* (car vec1) (cadr vec2)) (* (cadr vec1) (car vec2)))) (setq arcDirection (if (> crossProduct 0) "CCW" "CW")) ;; 打断选定的线 (command "._break" breakPline "_non" startPoint "_non" endPoint) ;; 创建圆弧 (if (equal arcDirection "CCW") (command "._arc" "_non" startPoint "_c" "_non" arcCenter "_non" endPoint) (command "._arc" "_non" endPoint "_c" "_non" arcCenter "_non" startPoint) ) ;; 设置圆弧图层 (setq arcEnt (entlast)) (if (entget arcEnt) (progn (setq arcData (entget arcEnt)) (setq arcData (subst (cons 8 breakLayer) (assoc 8 arcData) arcData)) (entmod arcData) ) ) ;; 恢复系统变量 (setvar "CMDECHO" oldCmdEcho) (setvar "OSMODE" oldOsmode) (princ (strcat "\n操作完成,圆弧已创建在图层 \"" breakLayer "\"。")) (princ) ) (princ "\n跳线圆弧命令已加载,输入 gjtx 开始使用。") (princ) 修改代码使其兼容autocad2007~autocad2026
08-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值