我試圖通過一個特殊的類方法(+(insatncetype)iniPersonDefault:
或+(instancetype)initWithFirstName...
)調用一個名爲XYZperson
的類的實例(person1,person2),以便初始化這些實例一個firstName
和lastName
和dateOfBirth
(不要擔心分娩是一個NSString
對象在這裏的日子,我會改的,一旦它的工作原理)Obj-C,初始化階段,從類方法到實例方法
爲了方便封裝陣列中的那些以前的對象「變量」,如圖下面的代碼。
我這樣做,因爲我理解,這是不可能的應對類方法在接口文件所以沒有@property
實例變量:
.m
文件:
#import "XYZPerson.h"
@implementation XYZPerson
// init methods
+(instancetype)initPersonDefault
{
return [self initWithFirstName:@"John" LastName:@"Doe" DateOfBirth:@"1234"];
}
+(id)initWithFirstName:(NSString *)aFristName
LastName:(NSString *)aLastName
DateOfBirth:(NSString *)aDateOfBirth
{
if (self == [XYZPerson class])
{
NSString *firstName2 = aFristName;
NSString *lastName2 = aLastName;
NSString *dateOfBirth2 = aDateOfBirth;
NSArray *info [email protected][firstName2,lastName2,dateOfBirth2];
//return [NSString stringWithFormat:@" %@ %@ born in %@", info[0], info[1], info[2] ];
// return (NSString *)lastName2;
// return (NSString *)dateOfBirth2;
return (NSArray *)info;
}
return [[self alloc]init];
}
// Other methods
-(void)saysomething : (NSString *)greeting
{
NSLog(@"%@ ", greeting);
}
-(void)sayHello: (NSArray *)infoP
{
NSString *results =[[infoP valueForKey:@"description"] componentsJoinedByString:@" "];
[self saysomething:results];
}
.h
文件:
#import <Foundation/Foundation.h>
@interface XYZPerson : NSObject
-(void)saysomething : (NSString *) greeting;
-(void)sayHello: (NSArray *)infoP;
+ (id)initWithFirstName:(NSString *)aFristName
LastName:(NSString *)aLastName
DateOfBirth:(NSString *)aDateOfBirth;
+(instancetype)initPersonDefault;
@end
只要我嘗試訪問與實例方法的對象變量,我很困惑,這裏是main.m
:
#import <Foundation/Foundation.h>
#import "XYZPerson.h"
#import "XYZShoutingPerson.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
XYZPerson *person1 = [XYZPerson initPersonDefault];
XYZPerson *person2 = [XYZPerson initWithFirstName:@"Henry" LastName:@"V" DateOfBirth:@"1234"];
NSLog(@" %@ et %@", [[person1 valueForKey:@"description"] componentsJoinedByString:@" "],
[[person2 valueForKey:@"description"] componentsJoinedByString:@" "]);
[person1 sayHello: person1];
}
return 0;
}
這裏是我的控制檯:
2014年5月11日12:30:28.258 fonctiontest [4317:303]李四1234等亨利五世1234
2014- 05-11 12:30:28.278 fonctiontest [4317:303] - [__ NSArrayI sayHello:]:無法識別的選擇器發送到實例0x102617a20
2014-05-11 12:30:28.279 fonctiontest [4317:303] ***終止應用程序由於未捕獲的異常'NSInvalidArgumentException',原因:' - [__ NSArrayI sayHello:]:無法識別的選擇器發送到實例0x102617a20'
...
更確切地說,我得到一個警告說:
不兼容的指針類型發送「XYZPerson *爲鍵入 '的NSArray *'
的參數所以我的猜測是person1
有一個複雜的狀態,它是類XYZPerson
的一個實例,它也包含一個數組。將它傳遞給-(void)sayHello : (NSArray *)infoP
方法中的指針infoP時,它不起作用。我想不出在person1
這個數組上調用最後一個方法該怎麼做?任何想法?
我是一個初學者,所以如果整個邏輯搞砸了,請讓我知道如何。
你永遠不會分配你的實例。 init方法應該是實例方法,您可以通過向該類發送+ alloc創建一個未初始化的實例。 – nielsbot
感謝nielsbot! – Jules