【发布时间】:2014-06-28 19:02:29
【问题描述】:
我正在尝试使用特殊的类方法(+(insatncetype)iniPersonDefault: 或 +(instancetype)initWithFirstName...)初始化名为 XYZperson 的类的实例(person1,person2),以便使用 firstName 和 @ 初始化这些实例987654325@ 和 dateOfBirth (不要担心出生日期在这里是 NSString 对象,一旦它起作用,我会更改它)
为方便起见,将那些先前的对象“变量”封装在一个数组中,如下面的代码所示。
我这样做是因为我知道无法在类方法中处理实例变量,因此接口文件中没有@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 =@[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-05-11 12:30:28.258 功能测试[4317:303] John Doe 1234 和 Henry V 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 来创建。
标签: objective-c class pointers methods