{"id":868,"date":"2013-08-21T06:51:00","date_gmt":"2013-08-21T06:51:00","guid":{"rendered":"http:\/\/tw.newtonstudio.com\/?p=868"},"modified":"2014-05-27T02:11:27","modified_gmt":"2014-05-27T02:11:27","slug":"objective-c-%e5%ad%b8%e7%bf%92%e7%ad%86%e8%a8%98-part-2","status":"publish","type":"post","link":"https:\/\/tw.newtonstudio.com\/?p=868","title":{"rendered":"Objective C \u5b78\u7fd2\u7b46\u8a18 (part 2): @property\u7684\u4f7f\u7528"},"content":{"rendered":"<p>@property \u7684\u4f7f\u7528<\/p>\n<p>\u5728\u7269\u4ef6\u5c0e\u5411\u8a2d\u8a08\u65b9\u6cd5\u4e2d\u6211\u5011\u6703\u4f7f\u7528\u5c01\u88dd\u4f86\u4fdd\u8b77\u985e\u5225\u6210\u54e1\uff08\u6210\u54e1\u4ea6\u5305\u542b\u4e86attribute\u8207method\uff09\uff0c\u6211\u5011\u901a\u5e38\u6703\u5bebmethod\u4f86\u5b58\u53d6attribute\uff0c\u547d\u540d\u70bagetter\u8207setter\uff0c\u4ee5\u4e0b\u793a\u7bc4objective C\u7684getter setter\u4f5c\u6cd5\uff1a<\/p>\n<p>A.h<\/p>\n<pre>#import &lt;Foundation\/Foundation.h&gt;\r\n\r\n@interface A : NSObject {\r\n\r\nint attr;\r\n\r\n}\r\n\r\n-(int)attr; \/\/\u7fd2\u6163\u4e0aobjective C\u4e0d\u6703\u5728getter\u5beb\u4e0aget, \u800c\u662f\u76f4\u63a5\u4f7f\u7528attribute\u4f5c\u70bagetter\r\n\r\n-(void)setAttr:(int)a;\r\n\r\n@end<\/pre>\n<p>A.m<\/p>\n<pre>#import \"A.h\"\r\n\r\n@implementation A\r\n\r\n- (int)attr {\r\n\r\nreturn self-&gt;attr; \/\/\u539f\u5247\u4e0a\u4e0d\u52a0self\u4e5f\u53ef\u4ee5, \u52a0\u4e86\u5c31\u53ef\u4ee5\u8ddfmethod\u5167\u7684\u8b8a\u6578\u4f5c\u5340\u9694\r\n\r\n}\r\n\r\n-(void)setAttr: (int) a {\r\n\r\nself-&gt;attr = a;\r\n\r\n}\r\n\r\n@end<\/pre>\n<p>\u7576\u4f60\u4f7f\u7528\u4ee5\u4e0a\u7684\u5beb\u6cd5\u4f5c\u70bagetter\u8207setter\u6642\uff0c\u60a8\u5728\u7a0b\u5f0f\u4e2d\u4f7f\u7528\u5be6\u9ad4\u7269\u4ef6\u6642\uff0c\u5c31\u53ef\u4ee5\u7528&#8221;.&#8221;\u7684\u65b9\u5f0f\u4f86\u4f5c\u5b58\u53d6, \u65b9\u5728 assignment\u7684\u5de6\u908a\u4ee3\u8868setter, \u5728\u53f3\u908a\u4ee3\u8868getter,\u793a\u7bc4\u5982\u4e0b:<\/p>\n<p>main.m<\/p>\n<pre>#import &lt;Foundation\/Foundation.h&gt;\r\n\r\n#import \"A.h\"\r\n\r\nint main(int argc, const char * argv[]) {\r\n\r\nA *a = [A alloc];\r\n\r\n[a.attr 30]; \/\/ assign 30 \u7d66\u9019\u500b\u7269\u4ef6\u7684attribute\r\n\r\nprintf(\"The attribute of A is %d\", a.attr); \/\/\u53d6\u51faa.attr\u7684\u503c, \u6703\u5370\u51faThe attribute of A is 30\r\n\r\n[a release];\r\n\r\n}<\/pre>\n<p>\u662f\u4e0d\u662f\u6bcf\u6b21\u90fd\u8981\u7528\u50b3\u7d71\u7684\u4f5c\u6cd5\u624d\u80fd\u9054\u6210&#8221;.&#8221;\u7684\u53d6\u7528\u5462? \u5176\u5be6Objective C\u5b89\u6392\u4e86\u4e00\u500b\u6bd4\u8f03\u7c21\u55ae\u7684\u4f5c\u6cd5,\u5c31\u662f@property\uff0c\u90a3\u70ba\u751a\u9ebc\u8981\u5148\u4ecb\u7d39\u4e0a\u9762\u7684\u505a\u6cd5\u5462\uff1f\u5f88\u7c21\u55ae\u56e0\u70ba\u4f7f\u7528\u4efb\u4f55\u6377\u5f91\u90fd\u61c9\u8a72\u5148\u77e5\u9053\u4ed6\u7684\u539f\u7406\u5427\uff1f\u77e5\u9053\u4e86\u539f\u7406\u672a\u4f86\u624d\u4e0d\u6703\u5728debug\u4e2d\u82e6\u54c8\u54c8\u3002\u4f7f\u7528\uff20property\u7684\u5beb\u6cd5\u5982\u4e0b:<\/p>\n<p>A.h<\/p>\n<pre>#import &lt;Foundation\/Foundation.h&gt;\r\n\r\n@interface A : NSObject {\r\n\r\nint attr;\r\n\r\n}\r\n\r\n@property int attr; \/\/\u9019\u6a23\u5c31\u6703\u81ea\u52d5\u5efa\u7acbgettery\u8207setter\r\n\r\n@end<\/pre>\n<p>A.m<\/p>\n<pre>#import \"A.h\"\r\n\r\n@implementation A\r\n\r\n@synthesize attr; \/\/ \u820a\u7248\u7684xcode\u9700\u8981\u6210\u96d9\u5bebproperty\u8207synthesize,\u65b0\u7248\u7684\u53ea\u8981\u5bebproperty\u5176\u5be6\u5c31\u53ef\u4ee5\u4e86,\r\n\r\n\/\/synthesize\u53ef\u4ee5\u8b93\u4f60\u6539property\u7684\u540d\u5b57, \u5beb\u6cd5\u662f @synthesize attr = ppp; (\u5c31\u6539\u6210ppp\u4e86)\r\n\r\n@end<\/pre>\n<p>main.m<\/p>\n<pre>#import &lt;Foundation\/Foundation.h&gt;\r\n\r\n#import \"A.h\"\r\n\r\nint main(int argc, const char * argv[]) {\r\n\r\nA *a = [A alloc];\r\n\r\n[a.attr 30]; \/\/ \u4e00\u6a23\u53ef\u4ee5\u4f7f\u7528\r\n\r\nprintf(\"The attribute of A is %d\", a.attr); \/\/\u53d6\u51faa.attr\u7684\u503c, \u6703\u5370\u51faThe attribute of A is\u00a030\r\n\r\n[a release];\r\n\r\n}<\/pre>\n<p>\u57fa\u672c\u4e0a\u4f7f\u7528@property \u6703\u81ea\u52d5\u4f5c\u4e09\u4ef6\u4e8b\u60c5:<\/p>\n<ol>\n<li>\u5efa\u7acb\u4e86 setPropertyName (setter)<\/li>\n<li>\u5efa\u7acb\u4e86 propertyName (getter)<\/li>\n<li>\u5efa\u7acb\u4e86 propertyName (attribute)<\/li>\n<\/ol>\n<div>*\u9019\u4e9bmethod\u662f\u53ef\u4ee5\u88aboverride\u7684, \u6240\u4ee5\u4f7f\u7528\u4e86@property\u5f8c, \u4f60\u4e5f\u53ef\u4ee5\u6539\u5beb\u6210\u81ea\u5df1\u60f3\u7528\u7684\u65b9\u5f0f\u3002<\/div>\n<div>@property\u7684\u8a2d\u5b9a \/\/\u7528\u4f86\u8a2d\u5b9aproperty\u7684\u53c3\u6578<\/div>\n<div>\u8b80\u5beb\u63a7\u5236<\/div>\n<div>\n<ol>\n<li>readwrite (\u9810\u8a2d): \u53ef\u4ee5\u8b80\u5beb\uff0csetter\u548cgetter\u65b9\u6cd5\u90fd\u6703\u81ea\u52d5\u52a0\u5165<\/li>\n<li>readonly: \u53ea\u80fd\u8b80, \u53ea\u6703\u52a0getter\u7684\u65b9\u6cd5<\/li>\n<\/ol>\n<\/div>\n<p>setter\u76f8\u95dc\u90e8\u5206<\/p>\n<ol>\n<li>assign(\u9810\u8a2d): \u7528\u65bc\u53ea\u6703\u548c\u53ef\u91cf\u5ea6\u7684\u6578\u503c\u4f5c\u7528\u7684\u60c5\u6cc1, _abc = b;<\/li>\n<li>retain\/strong \u5728\u6307\u5b9a\u6642\u6703\u547c\u53eb\u7269\u4ef6\u7684retain\u6307\u4ee4, \u7136\u5f8c\u524d\u4e00\u500b\u6578\u503c\u6703release\u6389<\/li>\n<li>copy: \u5728\u6307\u5b9a\u6642\u6703\u547c\u53eb\u7269\u4ef6\u7684copy\u6307\u4ee4, \u7136\u5f8c\u524d\u4e00\u500b\u6578\u503c\u6703release\u6389 (\u4e00\u5b9a\u8981\u5be6\u4f5cNSCopy\u7684Protocol, \u5426\u5247\u6703\u639b\u9ede)<\/li>\n<\/ol>\n<div>atomicity (\u55ae\u4e00\u6027)<\/div>\n<div>\n<ol>\n<li>atomic (\u9810\u8a2d): \u6703\u8b93\u5c6c\u6027\u6709\u57f7\u884c\u7dd2\u5b89\u5168(thread-safe)\u7684\u7279\u6027<\/li>\n<li>nonatomic: synthesize\u7684\u5b58\u53d6\u8005\u6703\u76f4\u63a5\u56de\u50b3\u6578\u503c<\/li>\n<\/ol>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>@property \u7684\u4f7f\u7528 \u5728\u7269\u4ef6\u5c0e\u5411\u8a2d\u8a08\u65b9\u6cd5\u4e2d\u6211\u5011\u6703\u4f7f\u7528\u5c01\u88dd\u4f86\u4fdd\u8b77\u985e\u5225\u6210\u54e1\uff08\u6210\u54e1\u4ea6\u5305\u542b\u4e86attribute\u8207 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[198],"tags":[199],"class_list":["post-868","post","type-post","status-publish","format-standard","hentry","category-objectivec","tag-property"],"_links":{"self":[{"href":"https:\/\/tw.newtonstudio.com\/index.php?rest_route=\/wp\/v2\/posts\/868","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tw.newtonstudio.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tw.newtonstudio.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tw.newtonstudio.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tw.newtonstudio.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=868"}],"version-history":[{"count":7,"href":"https:\/\/tw.newtonstudio.com\/index.php?rest_route=\/wp\/v2\/posts\/868\/revisions"}],"predecessor-version":[{"id":871,"href":"https:\/\/tw.newtonstudio.com\/index.php?rest_route=\/wp\/v2\/posts\/868\/revisions\/871"}],"wp:attachment":[{"href":"https:\/\/tw.newtonstudio.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=868"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tw.newtonstudio.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=868"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tw.newtonstudio.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=868"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}