搜尋

首頁  >  問答  >  主體

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

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

PHPzPHPz2769 天前410

全部回覆(4)我來回復

  • 迷茫

    迷茫2017-04-21 11:18:48

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

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-21 11:18:48

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

    回覆
    0
  • 迷茫

    迷茫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。

    回覆
    0
  • 高洛峰

    高洛峰2017-04-21 11:18:48

    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。

    回覆
    0
  • 取消回覆