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. 一般情况下应该如何写?
迷茫2017-04-21 11:18:48
假設不考慮使用@private宣告變數的這種特殊方式,在object-c裡面,只要是宣告了的變數和屬性都可以在包含了這個宣告的.m檔案裡使用。
所有東西都public當然不太符合物件導向設計裡面的封裝性啦,那些直接寫在.m裡面的變數和屬性就是為做到資訊隱藏,保證封裝性,這種手法的官方名稱叫Category,算是寫出object-c lib的必備手法了。
因此,針對所有問題的答案:
天蓬老师2017-04-21 11:18:48
直接寫在{}裡面的是實例變數,前面寫上@property的是屬性。對於屬性來說,obj-c會自動給予產生一個實例變量,然後在存取屬性時(用get/set方法或用obj.attr)會用到這個自動產生的實例變數並做一些其他額外的事情。
迷茫2017-04-21 11:18:48
@Huan Du 已經說得很好了,再說點我的使用習慣
1. 不使用ivar,而是在Class Extension裡,聲明@property,這樣在內部就可以使用self.xxx來get/set value了,程式碼看上去能更舒服些。
2. 頭文件裡,只聲明對外可見的method/property,讓頭檔的內容盡量少而清晰。如果有個property對外為唯讀,內部為可讀寫,可以在Class Extension裡將該property重新宣告為readwrite。
高洛峰2017-04-21 11:18:48
在instance前面可以冠以@private
我一般的做法,也是最新XCode自動產生的程式碼格式是,public的寫成@property,放到.h文件,private的寫成
@interface Foo () @property Bar bar; @end
放到.m檔裡面。
那個空的圓括號是category,不寫或寫成hidden都行,總之會使得其他class無法看到這個property。