Objective-C 中下列类属性的写法有何不同?

 手机用户2502869145_913 发布于 2022-10-25 09:00

1. 在 .h 文件中,例如:

@interface PullToRefreshView : UIView {
	UILabel *lastUpdatedLabel;
	UILabel *statusLabel;
	CALayer *arrowImage;
	UIActivityIndicatorView *activityView;
}

2. 在 .h 文件中,例如:

@property (nonatomic, strong) UIScrollView *scrollView;

3. 在 .m 文件中,例如:

@interface PullToRefreshView

@property (nonatomic, strong) NSArray *titles;

@end

4. 在 .m 文件中,例如:

@implementation TopicListViewController {
    PullToRefreshView *pull
}

简而言之,是否是
1. 在头文件中的是 public 属性,在 .m 中的是 private 属性?
2. 在 @interface 和 @implementation 中用大括号扩起来的和 @property 有何区别?(除了synthesize方面)
3. 一般情况下应该如何写?

4 个回答
    1. instance, public
    2. property (instance, setter, getter自动生成), public
    3. 同2
    4. instance, public

    在instance前面可以冠以@private

    我一般的做法,也是最新XCode自动生成的代码格式是,public的写成@property,放到.h文件,private的写成

    @interface Foo ()
    
    @property Bar bar;
    
    @end

    放到.m文件里面。

    那个空的圆括号是category,不写或者写成hidden都行,总之会使得其他class无法看到这个property。

    2022-10-26 14:41 回答
  • @Huan Du 已经说得很好了,再说点我的使用习惯

    1. 不使用ivar,而是在Class Extension里,声明@property,这样在内部就可以使用self.xxx来get/set value了,代码看上去能更舒服些。

    2. 头文件里,只声明对外可见的method/property,让头文件的内容尽量少而清晰。如果有个property对外为只读,内部为可读写,可以在Class Extension里将该property重新声明为readwrite。

    2022-10-26 14:41 回答
  • 直接写在{}里面的是实例变量,前面写上@property的是属性。对于属性来说,obj-c会自动给生成一个实例变量,然后在访问属性时(用get/set方法或者用obj.attr)会用到这个自动生成的实例变量并做一些其他额外的事情。

    2022-10-26 14:41 回答
  • 假设不考虑使用@private声明变量的这种特殊方式,在object-c里面,只要是声明了的变量和属性都可以在包含了这个声明的.m文件里使用。

    所有东西都public当然不太符合面向对象设计里面的封装性啦,那些直接写在.m里面的变量和属性就是为做到信息隐藏,保证封装性,这种手法的官方名称叫Category,算是编写object-c lib的必备手法了。

    因此,针对所有问题的答案:

    1. 都是public的,只不过.m文件无法#import,间接的实现了private
    2. 大括号括起来的是instance variable(实例变量),只是简单的数值,不能绑定get/set方法,不能自动retain/copy/atomic,就相当于一个简单的跟着instance走的局部变量;property则是对get/set方法的语法封装(所谓的语法糖),将两个方法声明变成一个property声明,并且通过标注各种attribute帮你完成许多基本任务。
    3. 我见过一些lib的写法是将暴露给外部的声明写在Foo.h里面,然后不想暴露给外部的写在Foo+Internal.h里面,通过这种约定告诉调用者,不要使用我内部的变量、属性和方法。个人比较喜欢这种做法。
    2022-10-26 14:41 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有