您好,匿名用户
随意问技术百科期待您的加入

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

0 投票

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. 一般情况下应该如何写?

用户头像 提问 2013年 11月1日 @ Libra 上等兵 (351 威望)
分享到:

1个回答

0 投票

假设不考虑使用@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里面,通过这种约定告诉调用者,不要使用我内部的变量、属性和方法。个人比较喜欢这种做法。
用户头像 回复 2013年 10月4日 @ Pantheon 上等兵 (388 威望)
提一个问题:

相关问题

0 投票
1 回复 50 阅读
0 投票
1 回复 33 阅读
用户头像 提问 2012年 12月1日 @ Akali 上等兵 (237 威望)
0 投票
1 回复 46 阅读
用户头像 提问 2012年 12月1日 @ Teemo 上等兵 (318 威望)
0 投票
1 回复 40 阅读
用户头像 提问 2012年 12月1日 @ 卫宫士郎 上等兵 (173 威望)

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...