Objective-C 中下列類別屬性的寫法有何不同?
PHPz
PHPz 2017-04-21 11:16:48
0
4
448

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. 一般情況下應該如何寫?

PHPz
PHPz

学习是最好的投资!

全部回覆(4)
迷茫

假設不考慮使用@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裡面,透過這種約定告訴呼叫者,不要使用我內部的變數、屬性和方法。個人比較喜歡這種做法。
Peter_Zhu

直接寫在{}裡面的是實例變數,前面寫上​​@property的是屬性。對於屬性來說,obj-c會自動給予產生一個實例變量,然後在存取屬性時(用get/set方法或用obj.attr)會用到這個自動產生的實例變數並做一些其他額外的事情。

迷茫

@Huan Du 已經說得很好了,再說點我的使用習慣

1. 不使用ivar,而是在Class Extension裡,聲明@property,這樣在內部就可以使用self.xxx來get/set value了,程式碼看上去能更舒服些。

2. 頭文件裡,只聲明對外可見的method/property,讓頭檔的內容盡量少而清晰。如果有個property對外為唯讀,內部為可讀寫,可以在Class Extension裡將該property重新宣告為readwrite。

小葫芦
  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。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板