iOS中定义成员变量时@property(nonatomic, copy/strong/assign/weak)小结

本文总结了在iOS开发中,使用@property定义成员变量时,针对NSString、NSArray、协议代理及避免循环引用时选择nonatomic搭配copy、strong、assign、weak的场景和原因,特别强调了在防止内存泄漏中合理使用weak的重要性。

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


   首先,用@property()定义一个成员变量时:1:生成一个带有下滑线的成员变量,2:生成成员变量的set和get方法

1:定义字符串为成员变量时:@property (nonatomic, copy) NSString *str;  //可变不可变都适用

2:定义数组为成员变量时:@property (nonatomic, strong)NSArray *array;  //可变不可变都适用

3:当使用协议和代理时,需要在协议的主动方定义一个id类型的delegate时,@property (nonatomic, assign)  id<协议名字> delegate;

4:这个需要注意:两个类互相引用时,nonatomic后面一定要用assign 或者 weak,不然会造成内存泄露,释放不完全


 关于第4点举个例子:有个Car类,一个Person类

人有一辆车,车里做这这个人

创建车对象的时候,会有一个强指针指向车这个对象

创建人对象的时候,会有一个强指针指向人这个对象


指定这个车就是人拥有的车时,会再有一个指针指向车对象,这时车对象就有两个指针指向

当车里坐的就是这个人时,也会有一个指针指向人这个对象,这时人对象也会有两个指针指向


如果nonatomic 后面是strong的话,那么人对象和车对象都是由两个强指针指向,在arc的环境下,释放车对象,释放人对象后,车对象和人对象还会各有一个强指针指向,并且强指针都是来自于对方。这种循环引用的话就会释放不完全,造成内存泄露。

在Person这个类里定义一个Car类型的车时,nonatomic后面用assign 或者 weak的话就只是赋值,或是一个弱指针指向车对象,当释放内存时,指向车对象的强指针被释放了后就只有一个弱指针指向,也会释放。这就可以解决上述的释放不完全的情况。

同样地,在Car类里定义Person类型的人时也可以用assign或者weak。

两个类里有一个用assign或者weak就可以解决。当然两个都用也可以。




#import <Foundation/Foundation.h> NS_ASSUME_NONNULL_BEGIN typedef NS_ENUM(NSInteger, HSAddressType) { HSAddressTypeProvince, // 省 HSAddressTypeCity, // 市 HSAddressTypeDistrict, // 区 }; @interface HSAddressViewModel : NSObject // 外部传进来的数据 @property (nonatomic, strong) NSDictionary *params; @property(nonatomic,assign)BOOL showProvince; @property(nonatomic,assign)BOOL showCity; @property(nonatomic,assign)BOOL showArea; // 是否展示搜索框 @property (nonatomic, assign) BOOL isShowSearch; @property (nonatomic, strong) NSArray *currentData; @property (nonatomic, assign) HSAddressType currentType; // 选择的好的数据 @property (nonatomic, strong) NSDictionary *selectData; @property (nonatomic, copy) NSString *_Nullable provinceStr; @property (nonatomic, copy) NSString *_Nullable cityStr; @property (nonatomic, copy) NSString *_Nullable districtStr; // 当前选择的省市区全部数据 @property (nonatomic, strong) NSArray *allProvinceArray; @property (nonatomic, strong) NSArray *cityArray; @property (nonatomic, strong) NSArray *districtArray; // 准备数据 - (void)getAllProvinceDataWithComplete:(void(^)(BOOL result))complete; // 获取省对应的城市数据 - (void)getCityDataByProvinceMap:(NSDictionary *)provenceDic Complete:(void(^)(BOOL result))complete; // 获取市对应的区数据 - (void)getDistrictDataByCityMap:(NSDictionary *)cityDic Complete:(void(^)(BOOL result))complete; - (void)setDistrictDataWithDistrictMap:(NSDictionary *)districtDic Complete:(void(^)(BOOL result))complete; // 切换按钮数据 - (void)changeCurrentType:(HSAddressType)type; // 设置原始数据 - (void)setOriginData; // 设置搜索数据 - (void)setSelectDataWithSearchString:(NSString *)searchStr; @end NS_ASSUME_NONNULL_END将上述IOS代码翻译成对应的鸿蒙代码
最新发布
07-29
<think>我们正在将iOS的Objective-C代码转换为鸿蒙(HarmonyOS)的ArkTS代码。原代码是一个自定义的UITableViewCell,用于显示地址信息。我们需要在鸿蒙中实现类似的自定义列表项(ListItem)组件。 原iOS代码分析: - 类名:HSAddressCell - 继承:UITableViewCell - 功能:在单元格中显示一个标签(UILabel),标签文本为“安徽省”,并设置了一些样式和约束。 在鸿蒙中,我们可以使用ArkUI(基于ArkTS)来构建UI。鸿蒙的列表使用List组件,列表项使用ListItem组件。我们可以创建一个自定义组件来替代HSAddressCell。 转换步骤: 1. 创建自定义组件:在鸿蒙中,我们可以使用@Component装饰器来创建一个自定义组件,类似于iOS中的自定义UITableViewCell。 2. 布局:原代码中使用Masonry(Auto Layout的封装)进行自动布局,在鸿蒙中我们可以使用Flex布局、相对布局等来实现。 3. 样式:设置文本样式(颜色、字体大小等)。 4. 适配多设备:鸿蒙支持一次开发多端部署,因此我们需要考虑组件的自适应能力。 注意:原代码中有一个根据版本判断字体大小的逻辑([HSUtil isOldVersion])。在鸿蒙中,我们可以使用资源文件或条件判断来实现不同设备的适配,但这里为了简化,我们先使用固定字体大小,后续再考虑多设备适配。 鸿蒙ArkTS代码实现: 我们将创建一个名为`HSAddressCell`的自定义组件,它继承自`ListItem`(实际上在ArkUI中,自定义列表项通常作为`List`的子组件,使用`@Component`构建)。 由于鸿蒙的List组件要求列表项必须包含在ListItem中,所以我们的自定义组件实际上就是ListItem的内容。 代码结构: - 使用`@Component`定义定义组件。 - 在build方法中构建UI。 - 使用Text组件代替UILabel。 - 使用Flex布局,设置文本左对齐,垂直居中。 具体实现如下:</think>### 将 iOS Objective-C 地址选择逻辑转换为鸿蒙 ArkTS #### 1. **架构转换思路** | iOS 概念 | 鸿蒙 ArkTS 等价实现 | |---------|-------------------| | `UITableViewCell` | `ListItem` 组件 | | `UILabel` | `Text` 组件 | | `Masonry` 自动布局 | Flex 弹性布局或栅格系统 | | `UIColor` | `ResourceColor` 资源管理 | | `initWithStyle` | `@Component` 组件构造器 | #### 2. **核心代码转换** ```typescript // AddressCell.ets @Component export struct HSAddressCell { @State addressText: string = "安徽省" // 状态管理[^1] build() { ListItem() { Flex({ alignItems: ItemAlign.Center }) { Text(this.addressText) .fontSize(this.getAdaptiveFontSize()) // 响应式字体 .fontColor($r('app.color.text_primary')) .margin({ left: 20 }) } .width('100%') .height(56) // 标准列表项高度 } } // 设备自适应字体逻辑 private getAdaptiveFontSize(): number { return windowWidth < 600 ? 14 : 18 // 根据屏幕宽度动态调整[^2] } } ``` #### 3. **列表使用示例** ```typescript // AddressListPage.ets @Entry @Component struct AddressPage { private addresses: string[] = ["安徽省", "北京市", "上海市"] build() { Column() { List({ space: 10 }) { ForEach(this.addresses, (item: string) => { ListItem() { HSAddressCell({ addressText: item }) } }) } .layoutWeight(1) // 弹性填充剩余空间 } } } ``` #### 4. **关键优化点** 1. **响应式布局**: ```typescript .onAreaChange((oldVal, newVal) => { this.windowWidth = newVal.width }) ``` 容器尺寸变化自动调整布局[^2] 2. **一多部署适配**: ```typescript @Builder adaptLayout() { if (deviceType === 'phone') { // 手机布局 } else { // 平板布局 } } ``` 3. **状态管理**: 使用 `@State` 实现数据驱动UI更新[^1],替代 Objective-C 的 KVO 机制 #### 5. **权限配置** 在 `module.json5` 添加位置权限: ```json "requestPermissions": [ { "name": "ohos.permission.LOCATION" } ] ``` ### 设计差异说明 1. **编程范式**: - Objective-C:命令式编程(显式操作视图) - ArkTS:声明式编程(数据驱动UI)[^1] 2. **布局系统**: - iOS:Auto Layout 约束系统 - 鸿蒙:Flex 布局 + 栅格系统(GridRow/GridCol)[^2] 3. **组件化**: - iOS:继承 `UITableViewCell` - 鸿蒙:`@Component` 装饰器构建独立组件 4. **状态管理**: - iOS:属性观察 (KVO) 或委托模式 - 鸿蒙:`@State`/`@Link` 响应式状态绑定 --- ### 相关问题 1. **如何在鸿蒙中实现类似 iOS 的 `didSelectRowAtIndexPath` 列表项点击事件?** (提示:`ListItem` 的 `onClick` 事件绑定) 2. **鸿蒙的 Flex 布局与 iOS Auto Layout 有何核心差异?** (提示:主轴/交叉轴概念 vs 约束关系) 3. **如何将 Objective-C 的 `UIColor` 颜色系统迁移到鸿蒙的资源管理系统?** (提示:`$r('app.color.xxx')` 资源引用) 4. **鸿蒙如何实现类似 Masonry 的链式语法布局?** (提示:ArkTS 的方法链调用 + 布局属性组合) 5. **在多设备适配场景下,鸿蒙的栅格系统(GridRow/GridCol)相比 iOS 的 Size Classes 有何优势?** (提示:断点响应机制 vs 设备特征抽象)[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值