从零开始:iOS(三)
整理一些Objective-c相關(guān)知識(shí).
c#與objective-c對(duì)照著看,一步一步來.重點(diǎn)在oc上.
1:新建類.
/*C#*/public class Person{private string name;public string GetName(){return name;}public void SetName(string value){name = value;}public static void SayHello(){ /*print hello*/}} /*o-c*//*.h*/ #import <Foundation/Foundation.h> @interface Person : NSObject {@private NSString *name; }-(NSString *) getName;-(void) setName:(NSString *) value;+(void) sayHello; @end/*.m*/ #import "Person.h"@implementation Person -(NSString *) getName{return name; } -(void) setName:(NSString *) value{if(name != value){[name release];name = [value retain];} } +(void) sayHello{NSLog(@"Hello"); } @end?
{...}即是成員變量,也可以使用@private @public @protected來指定訪問級(jí)別. 如果不加,默認(rèn)是protect.方法默認(rèn)就是public,你在xcode里也@不出來訪問修釋符.
- 方法前加減號(hào),表示這個(gè)方法是對(duì)象方法, + 方法前加加號(hào),表示這個(gè)方法是類方法, c#同學(xué)可以感受下.
2:Two Stage Creation?兩段構(gòu)造模式.
/*C#*/ Person p = new Person(); //創(chuàng)建一個(gè)實(shí)例 /*oc*/ Person *p = [[Person alloc] init]oc在構(gòu)建對(duì)象的時(shí)候采用的是兩段構(gòu)造. 先調(diào)用了(+) alloc方法, 再調(diào)用(-) init方法 alloc分配內(nèi)存空間,init負(fù)責(zé)初始化值. 再另寫一個(gè) 對(duì)比下.那就秒懂了,其實(shí)就這點(diǎn)事.理解很容易.
/*C# 添加構(gòu)造函數(shù)*/ public Person() {} public Person(string name) {this.name = name;
} /*C# 構(gòu)建對(duì)象*/ Person p = new Person("New Name"); /*oc 這里只寫出 .m的實(shí)現(xiàn),*/ -(id) initWithName:(NSString *)value{self = [super init];if(self){[name release];name = [value retain];} return self; }/*oc 構(gòu)建對(duì)象*/ Person p = [[Person alloc] initWithName:@"New Name"];
-(id) 表示返回的是一個(gè)指針(不習(xí)慣就叫對(duì)象吧),self等同于 c#里的 this.
init沒啥好說的,深入alloc一點(diǎn)吧.
這里引用http://blog.devtang.com/blog/2013/01/13/two-stage-creation-on-cocoa/該blog的一段文字.
當(dāng)我們通過alloc或allocWithZone方法創(chuàng)建對(duì)象時(shí),cocoa會(huì)返回一個(gè)未”初使化“過的對(duì)象。在這個(gè)過程中,cocoa除了上面提到的申請(qǐng)了一塊足夠大的內(nèi)存外,還做了以下3件事:
我再貼一段 NSObject.m 里關(guān)于 alloc和allocWithZone的實(shí)現(xiàn)
+ (id) alloc {return [self allocWithZone: NSDefaultMallocZone()]; } + (id) allocWithZone: (NSZone*)z {return NSAllocateObject (self, 0, z); }/*通過allocWithZone :類方法調(diào)用NSAllocateObject 函數(shù)分配了對(duì)象*/struct obj_layout {NSUInteger retained; }; inline id NSAllocateObject (Class aClass, NSUInteger extraBytes, NSZone *zone) {int size = 計(jì)算容納對(duì)象所需內(nèi)存大小;id new = NSZoneMalloc(zone,size);memset(new, 0, size);new = (id)&((struct obj_layout *)new)[1]; } /*NSAllocateObject 函數(shù)通過調(diào)用NSZoneMalloc 函數(shù)來分配存放對(duì)象所需的內(nèi)存空間,之后將該內(nèi)存空間置0,最后返回作為對(duì)象而使用的指針。*/http://book.2cto.com/201305/23851.html?這里是我在網(wǎng)上尋的文章,詳細(xì)解釋了,它在內(nèi)部是如何執(zhí)行那三件事的.
關(guān)于 new ?, new 等同于 alloc init 雙段構(gòu)造,唯一缺點(diǎn)就是不能使用帶參的構(gòu)造, 如果new之后調(diào)用 initWithName 會(huì)出錯(cuò),所以還是遵循官方約定的,使用雙段構(gòu)造.先寫到這.
?
轉(zhuǎn)載于:https://www.cnblogs.com/igqtdh/p/3257590.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的从零开始:iOS(三)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 访问List的itemRenderer的
- 下一篇: http://www.shengshiy