你好,歡迎來到IOS教程網

 Ios教程網 >> IOS訊息 >> 關於IOS >> iOS 擴展機制category與associative

iOS 擴展機制category與associative

編輯:關於IOS

category和associative作為objective-c 擴展機制的兩個特性,category可以通過它來擴展方法;associative可以通過它來擴展屬性。

在iOS開發過程中,前者category比較常見,也比較簡單,這裡就不說了,這裡主要說一下associative;

後者associative相對用的就比較少,要用associative就必須使用#import,然後調用objc_setAssociatedObject 和 objc_getAssociatedObject 方法分別為屬性添加setter 和 getter方法,就可以實現屬性擴展了。

下面介紹一下這兩個方法:

①:void objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy)

其中的參數分別是:

Parameters

object: The source object for the association.

key: The key for the association.

value: The value to associate with the key key for object. Pass nil to clear an existing association.

policy: The policy for the association

其中的policy有

enum {

OBJC_ASSOCIATION_ASSIGN = 0,

OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,

OBJC_ASSOCIATION_COPY_NONATOMIC = 3,

OBJC_ASSOCIATION_RETAIN = 01401,

OBJC_ASSOCIATION_COPY = 01403

};

②:id objc_getAssociatedObject(id object, void *key)

Parameters

object: The source object for the association.

key: The key for the association.

Return Value

The value associated with the key key for object.

都比較簡單,下面就通過一個demo來說明吧!

我這裡是擴展UIImageview為其添加一個方法和一個屬性。

category的頭文件:

[cpp] view plaincopy

  1. #import
  2. @interface UIImageView (associate)
  3. @property(nonatomic,strong)NSString* myString;
  4. -(void)Output;
  5. @end

    category的實現文件:

    [cpp] view plaincopy

    1. #import #import "UIImageView+associate.h"
    2. static void * MyKey = (void *)@"MyKey";
    3. @implementation UIImageView (associate)
    4. -(NSString*)myString {
    5. return objc_getAssociatedObject(self, MyKey); }
    6. -(void)setMyString:(NSString *)string {
    7. objc_setAssociatedObject(self, MyKey, string, OBJC_ASSOCIATION_COPY_NONATOMIC); }
    8. -(void)Output {
    9. NSLog(@"output mystring:%@",self.myString); }
    10. @end
    11. 說明:頭文件中添加了一個屬性和一個方法,在實現文件中使用associative特性為屬性重寫了setter和getter方法,都比較簡單。

      測試一下:

      [cpp] view plaincopy

      1. UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"[email protected]"]]; imageView.bounds = CGRectMake(50, 50, 100, 100);
      2. imageView.myString = @"hello world"; [self.view addSubview:imageView];
      3. [imageView Output];
        運行後,模擬器上就顯示一個圖片,終端輸出:output mystring:hello world
  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved