标签:name 苹果 而不是 span sar nsarray 允许 写法 nsstring
什么是工厂方法(快速创建方法)
自定义类工厂方法的规范
示例
+ (id)person; + (id)person { return [[Person alloc]init]; } + (id)personWithAge:(int)age; + (id)personWithAge:(int)age { Person *p = [[self alloc] init]; [p setAge:age]; return p; }
其实苹果在书写工厂方法时也是按照这样的规划书写 [NSArray array]; [NSArray arrayWithArray:<#(NSArray *)#>]; [NSDictionary dictionary]; [NSDictionary dictionaryWithObject:<#(id)#> forKey:<#(id<NSCopying>)#>]; [NSSet set]; [NSSet setWithObject:<#(id)#>];
为了解决这个问题, 以后在自定义类工厂时候不要利用父类创建实例对象, 改为使用self创建, 因为self谁调用当前方法self就是谁
示例
interface Person : NSObject + (id)person; @end @implementation Person + (id)person { return [[Person alloc]init]; } @end @interface Student : Person @property NSString *name; @end @implementation Student @end int main(int argc, const char * argv[]) { Student *stu = [Student person];// [[Person alloc] init] [stu setName:@"lnj"]; // 报错, 因为Person中没有setName }
@interface Person : NSObject + (id)person; @end @implementation Person + (id)person { // return [[Person alloc]init]; // 谁调用这个方法,self就代表谁 // 注意:以后写类方法创建初始化对象,写self不要直接写类名 return [[self alloc]init]; } @end @interface Student : Person @property NSString *name; @end @implementation Student @end int main(int argc, const char * argv[]) { Student *stu = [Student person];// [[Student alloc] init] [stu setName:@"lnj"]; }
标签:name 苹果 而不是 span sar nsarray 允许 写法 nsstring
原文地址:http://www.cnblogs.com/xufengyuan/p/6576416.html