Objective-C中的@property和@synthesize用法

@代表“Objective-C”的標志,證明您正在使用Objective-C語言

?

Objective-C語言關鍵詞,@property與@synthesize配對使用。

?

功能:讓編譯好器自動編寫一個與數據成員同名的方法聲明來省去讀寫方法的聲明。

?

如:

1、在頭文件中:

C代碼??收藏代碼
  1. @property?int?count;??

等效于在頭文件中聲明2個方法:

C代碼??收藏代碼
  1. -?(int)count;??
  2. -(void)setCount:(int)newCount;??

?

2、實現文件(.m)中

C代碼??收藏代碼
  1. @synthesize?count;??

等效于在實現文件(.m)中實現2個方法。

C代碼??收藏代碼
  1. -?(int)count??
  2. {??
  3. ????return?count;??
  4. }??
  5. -(void)setCount:(int)newCount??
  6. {??
  7. ????count?=?newCount;??
  8. }??

??

以上等效的函數部分由編譯器自動幫開發者填充完成,簡化了編碼輸入工作量。

?

格式:

?

聲明property的語法為:@property (參數1,參數2) 類型 名字;

?

如:

C代碼??收藏代碼
  1. @property(nonatomic,retain)?UIWindow?*window;??

?

其中參數主要分為三類:

?

讀寫屬性: (readwrite/readonly)

setter語意:(assign/retain/copy)

原子性: (atomicity/nonatomic)

?

各參數意義如下:

?

readwrite:?產生setter\getter方法

readonly:?只產生簡單的getter,沒有setter。

assign:?默認類型,setter方法直接賦值,而不進行retain操作

retain:?setter方法對參數進行release舊值,再retain新值。

copy:?setter方法進行Copy操作,與retain一樣

nonatomic:?禁止多線程,變量保護,提高性能

?

參數類型

參數中比較復雜的是retain和copy,具體分析如下:

?

getter 分析

?

1、

C代碼??收藏代碼
  1. @property(nonatomic,retain)test*?thetest;??
  2. @property(nonatomic?,copy)test*?thetest;??

等效代碼:

C代碼??收藏代碼
  1. -(void)thetest??
  2. {??
  3.   return?thetest;??
  4. }??

?

2、

C代碼??收藏代碼
  1. @property(retain)test*?thetest;??
  2. @property(copy)test*?thetest;??

等效代碼:

C代碼??收藏代碼
  1. -(void)thetest??
  2. {??
  3. ????[thetest?retain];??
  4. ????return?[thetest?autorelease];??
  5. }??

?

setter分析

?

1、

C代碼??收藏代碼
  1. @property(nonatomic,retain)test*?thetest;??
  2. @property(retain)test*?thetest;??

等效于:

C代碼??收藏代碼
  1. -(void)setThetest:(test?*)newThetest?{??
  2. ????if?(thetest!=?newThetest)?{??
  3.   ??????[thetestrelease];??
  4.   ??????thetest=?[newThetest?retain];??
  5. ????}??
  6. }??

??

?2、

C代碼??收藏代碼
  1. @property(nonatomic,copy)test*?thetest;??
  2. @property(copy)test*?thetest;??

?等效于:

C代碼??收藏代碼
  1. -(void)setThetest:(test?*)newThetest?{??
  2. ????if?(thetest!=?newThetest)?{??
  3.   ??????[thetest?release];??
  4.   ??????thetest=?[newThetest?copy];??
  5. ????}??
  6. }??

?

nonatomic

如果使用多線程,有時會出現兩個線程互相等待對方導致鎖死的情況(具體可以搜下線程方面的注意事項去了解)。在沒有(nonatomic)的情況下,即默認(atomic),會防止這種線程互斥出現,但是會消耗一定的資源。所以如果不是多線程的程序,打上(nonatomic)即可

?

retain

代碼說明

如果只是@property NSString*str;?則通過@synthesize自動生成的setter代碼為:

C代碼??收藏代碼
  1. -(void)setStr:(NSString*)value{??
  2. ????str=value;??
  3. }??

??

如果是@property(retain)NSString*str;?則自動的setter內容為:

C代碼??收藏代碼
  1. -(void)setStr:(NSString*)v{??
  2. ????if(v!=str){??
  3. ????????[str?release];??
  4. ????????str=[v?retain];??
  5. ????}??
  6. }??

?

?

所有者屬性

我們先來看看與所有權有關系的屬性,關鍵字間的對應關系。

屬性值 關鍵字 所有權

strong__strong
weak__weak
unsafe_unretained__unsafe_unretained
copy__strong
assign__unsafe_unretained
retain__strong

strong

該屬性值對應 __strong 關鍵字,即該屬性所聲明的變量將成為對象的持有者。

weak

該屬性對應 __weak 關鍵字,與 __weak 定義的變量一致,該屬性所聲明的變量將沒有對象的所有權,并且當對象被破棄之后,對象將被自動賦值nil。

并且,delegate 和 Outlet 應該用 weak 屬性來聲明。同時,如上一回介紹的 iOS 5 之前的版本是沒有 __weak 關鍵字的,所以 weak 屬性是不能使用的。這種情況我們使用 unsafe_unretained。

unsafe_unretained

等效于__unsafe_unretaind關鍵字聲明的變量;像上面說明的,iOS 5之前的系統用該屬性代替 weak 來使用。

copy

與 strong 的區別是聲明變量是拷貝對象的持有者。

assign

一般Scalar Varible用該屬性聲明,比如,int, BOOL。

retain

該屬性與 strong 一致;只是可讀性更強一些。

轉載于:https://www.cnblogs.com/facial/p/4388484.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/273321.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273321.shtml
英文地址,請注明出處:http://en.pswp.cn/news/273321.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c++11編碼規范 NULL還是nullptr

0和nullptr/NULL 至于指針(地址值),根據實際選擇用0、NULL還是nullptr。對使用了C11特性的項目,選用nullptr;對于C03項目,推薦NULL,因為它像是一個指針轉載于:https://www.cnblogs.com/JD85/p/4…

Android用戶界面程序設計示例

[例1]按鈕和Toast彈出對話框 1 [例2] TextView文本框 (1) 3 [例3]TextView文本框 (2) 4 [例4]編輯框EditText 4 [例5]單選RadioButton 6 [例6]Toast的用法簡介 8 [例7]多選checkbox 12 [例8]菜單Menu 14 …

innerText,outerText,innerHTML,outerHTML區別

document.body.innerHTML; innerText,outerText,innerHTML,outerHTML資料outerHTML:標簽對象外部的HTML文本(包括該標簽) innerHTML:標簽對象內部的HTML文本(不包括該標簽) innerText: 標簽對象內部的…

Ubuntu安裝adobe字體

Ubuntu的字體目錄存放在/usr/share/fonts目錄下,可以看到該目錄下有4個目錄, 12$ ls /usr/share/fonts/cmap truetype type1 X11我們在truetype目錄下新建一個adobe的目錄來存放需要安裝的Adobe中文字體,并把已經下載好的字體復制到該目錄…

Spring Thread Pool 線程池的應用

Spring and Java Thread example 掃掃關注“茶爸爸”微信公眾號堅持最初的執著,從不曾有半點懈怠,為優秀而努力,為證明自己而活。Download it – Spring-Thread-Example.zip (22 KB)轉自:http://www.mkyong.com/spring/spring-and…

數據庫操作類型簡介

SQL語言大體上可以分為四大類: 數據查詢語言(DQL),數據操縱語言(DML),數據定義語言(DDL),數據控制語言(DCL)。 1. 數據查詢語言DQL數…

Emule使用Upnp,解決Lowid和port not reachable的問題

路由器上鉤選開啟Upnp Emule->選擇->擴展選項->Upnp, 服務器:【從URL更新】http://upd.emule-security.org/server.met轉載于:https://www.cnblogs.com/zhyong/p/4422139.html

Longest Palindromic Substring

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 題目描述很簡單,就是尋找一個字符串的最大回文。 1.暴力搜索 窮舉所有的可能…

Integer 中的緩存類IntegerCache

2014年去某公司筆試的時候遇到這么一道題: public class Test {public static void main(String[] args) {Integer int1 Integer.valueOf("100");Integer int2 Integer.valueOf("100");System.out.println(int1 int2);} } 問打印的結果的多少…

Android動畫及滑動事件沖突解決(轉載)

原文鏈接:http://blog.csdn.net/singwhatiwanna/article/details/38168103 Android開發中動畫和事件處理是程序員邁向高手的必經之路,也是重點和難點。 此篇轉載文章思路清晰,結構合理,用圖文混合的方式完美的講解了動畫和事件沖突…

在main函數前后執行的函數之 C語言

在gcc中&#xff0c;可以使用attribute關鍵字&#xff0c;聲明constructor和destructor&#xff0c;來指定了函數在main之前或之后運行,代碼如下&#xff1a; 1 #include <stdio.h>2 3 __attribute((constructor)) void before_main()4 {5 printf("%s/n",_…

VSTO開發,轉帖

http://www.cnblogs.com/oneivan/p/4243574.html轉載于:https://www.cnblogs.com/xianerwonder/p/4432595.html

PowerDesigner的漢化破解安裝到逆向工程(ORACLE)

一、軟件安裝 1、下載軟件并安裝安裝16.5漢化版下載地址&#xff1a;真正的漢化-PowerDesigner 16.5 漢化&#xff08;包含安裝文件和漢化文件&#xff09; 破解包下載地址&#xff1a;PowerDesigner V16.5 安裝文件 及 破解文件 &#xff08;包含安裝文件和破解文件&#xff0…

JAVA開發隨記

想到一點寫一點&#xff0c;遇到一點補充一點。 1、成員變量 在定義成員變量時盡量不要直接賦值&#xff0c;最好是在初始化信息的時候進行賦值操作。如果需要在屬性定義的時候進行賦值&#xff0c;那么請用final修飾該屬性。錯誤實例 class A extends B {/** 到期日距離當前…

PHP反射ReflectionClass、ReflectionMethod 入門教程

PHP反射ReflectionClass、ReflectionMethod 入門教程 作者&#xff1a;SNSGOU 發布于&#xff1a;2014-03-16 16:44:00 分類&#xff1a;PHP 瀏覽(6145) PHP5 具有完整的反射API&#xff0c;添加對類、接口、函數、方法和擴展進行反向工程的能力。 反射是什么&#xff…

Oracle開發常用知識

一、利用游標實現循環嵌套 在對oracle數據進行操作時我們會經常碰到循環甚至循環嵌套的情況。這個時候游標的作用就體現出來了。 DECLAREvId NUMBER(19);vDate DATE;--a表游標定義CURSOR a_cursor ISSELECT DISTINCT o.employeeId FROM operations o WHERE o.employeeId IS N…

條件控制(if ) ( case)

一&#xff1a;IF應用格式 (1)                  (2)                (3) IF 條件 THEN           IF 條件 THEN            IF 條件1 THEN --代碼塊               --代碼塊          …

使用臨時表解決union和order by不能同時使用的問題

最近遇見了這樣一個問題&#xff0c;有4張表&#xff0c;A&#xff08;單據&#xff09;表&#xff0c;B&#xff08;產品&#xff09;表&#xff0c;C&#xff08;產品類型&#xff09;&#xff0c;D&#xff08;單據產品關聯表&#xff09;。 B表有唯一對應的類型C&#xff…

2.3線性表的鏈式存儲和運算—雙向鏈表

以上討論的單鏈表的結點中只有一個指向其后繼結點的指針域next&#xff0c;因此若已知某結點的指針為p&#xff0c;其后繼結點的指針則為p->next &#xff0c;而找其前驅則只能從該鏈表的頭指針開始&#xff0c;順著各結點的next 域進行&#xff0c;也就是說找后繼的時間性能…

Oracle常用字符串操作

參考&#xff1a; 一、oracle操作字符串&#xff1a;拼接、替換、截取、查找&#xff1b; 二、oracle中的trim函數使用介紹 --字符串去空格 --輸出:a b c; SELECT TRIM( a b c ) || ; FROM dual; SELECT TRIM(BOTH FROM a b c ) || ; FROM dual; --輸出: a …