Object-C 学习笔记(五)---构造方法

原创 2013年12月02日 16:44:41

说到构造方法,我很想吐槽,Object-C是一种面相对象的语言,但是感觉OC自立门户,思想一致,语法奇葩.

(1) 由C语言发展而来,却抛弃了世界统一的写法.

(2)大家都知道C++是既面向过程,也面向对象,但是新版的C++都完全面相对象,封装程度跟java和C#差不多,但是Object-C居然比C++封装程度还低.

今天发现,OC连构造方法都要自定义

例子:

//
//  People.h
//  Constructor
//  DRAGON
//  Created by 5016 on 13-12-2.
//  Copyright (c) 2013年 dradon. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface People : NSObject

//属性声明
//引用型使用retain,基本数据类型使用:assign
//nonatomic 非原子性操作(引起线程安全问题);atomic 原子性操作
@property(retain,nonatomic)NSString *name;
@property(assign,nonatomic)NSInteger age;
@property(retain,nonatomic)NSString *school;

//构造方法自定义
-(People *)initWithName:(NSString*) name
                 andAge:(NSInteger) age
              andSchool:(NSString*) school;

+(People *)PeopleWithName:(NSString*) name
                   andAge:(NSInteger) age
                andSchool:(NSString*) school;
//无参构造方法
+(People *)_People;

@end

//
//  People.m
//  Constructor
//  DRAGON
//  Created by 5016 on 13-12-2.
//  Copyright (c) 2013年 dradon. All rights reserved.
//

#import "People.h"

@implementation People

//使用属性定义,自动生成getter和setter
@synthesize name = _name;
@synthesize age = _age;
@synthesize school = _school;

//自定义无参构造方法
+(People *)_People
{
    People* person = [[People alloc] init];
    return [person autorelease];//放入自动释放池
}

//构造方法自定义 不使用@synthesize 
-(People *)initWithName:(NSString*) name
                 andAge:(NSInteger) age
              andSchool:(NSString*) school
{
    if(self = [super init])
    {
        self.name = name;
        self.age = age;
        self.school = school;
    }
    
    return self;
}

+(People *)PeopleWithName:(NSString*) name
                   andAge:(NSInteger) age
                andSchool:(NSString*) school
{
    People * person = [[People alloc] initWithName:name andAge: age andSchool:school];
    return [person autorelease];//放入自动释放池
}

@end

//
//  main.m
//  Constructor
//  DRAGON
//  Created by 5016 on 13-12-2.
//  Copyright (c) 2013年 dradon. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "People.h"

int main(int argc, const char * argv[])
{

    //无参构造方法
    People* person1 = [People _People];
    person1.name = @"DRAGON";
    person1.age = 23;
    person1.school = @"GDOU";
    NSLog(@"我是%@,今年%ld岁,就读于%@.",person1.name,person1.age,person1.school);
    //带参构造方法
    People* person2 = [People PeopleWithName:@"XX" andAge:18 andSchool:@"SCNU"];
    NSLog(@"我是%@,今年%ld岁,就读于%@.",person2.name,person2.age,person2.school);

    return 0;
}

以上是笔者仿照别的高级语言里,使用一个(-)类方法,加上一个(+)静态方法,结合起来做成一个构造方法,这样看起来可读性就好多了.

其实原理是借助一个类方法初始化对象,然后使用静态方法返回.但是要注意的是,返回对象引用的同时需要把引用设置成autorelease

Autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的Autorelease pool中,当该pool被释放时,该pool中的所有Object会被调用Release。

在Iphone项目中,大家会看到一个默认的Autorelease pool,程序开始时创建,程序退出时销毁,

按照对Autorelease的理解,岂不是所有autorelease pool里的对象在程序退出时才release, 这样跟内存泄露

有什么区别?

答案:对于每一个Runloop, 系统会隐式创建一个Autorelease pool,这样所有的release pool会构成一个象

CallStack一样的一个栈式结构,在每一个Runloop结束时,当前栈顶的Autorelease pool会被销毁,这样这个

pool里的每个Object会被release。





相关文章推荐

黑马程序员-Object-C之构造方法

---------------------------ASP.Net+Unity开发、.Net培训、期待与您交流!---------------------------...

IOS开发基础Object-C( 04)—构造方法和description方法

在上一篇博客中,我们简单介绍了一下点语法和self,相信大家对点语法以及self有了一点的了解,点语法的本质就是调用get方法和set方法。那么今天我们再来介绍一下构造方法和description。 ...

黑马程序员----Objective-C学习笔记之构造方法

------Java培训、Android培训、iOS培训、.Net培训-------- 1、构造方法的调用  Dog *d = [Dog new]; new方法做三件事: A、使...

Object-C学习笔记五-----使用跨文件依赖关系

前面所有的全部写在main函数里面。这样即不方便查找,也不方便修改。所以我们提取相应的类拼接在一起,方便查看和修改。 首先是Tire类和Engine类 File-New File 出现如下画面 ...

ios学习笔记之Object-C—字符串

在Object-c中,字符串的声明是: NSString *aString;  aString并不真正包含一个字符串对象—它是指向内存中字符串对象的指针。(和C语言中,用指针指向字符串的声明类似); ...

ios学习笔记一之Object-c基础

源代码文件扩展名头文件.h 实现文件.m类的定义@ interface SimpleClass: NSObject ..代码片段 @end类的属性@property (readonly)属性类型 ...

Object-c的三大特性 学习笔记

学习OC的笔记,记下了分享一下。 Object-C,跟所有的面向对象语言一样,都具有三大特性。 三大特性:封装、继承、多态。   A.封装:     A.1成员变量的封装     ...

OC学习笔记(9)Object-C多态的使用

1、基类ASShape //.h #import @interface ASShape : NSObject -(void) draw; @end //.m #import "ASShape.h"...

OC学习笔记(8)Object-C组合使用

1、ASPoint类 //.h #import @interface ASPoint : NSObject @property(nonatomic,assign) double x; @prop...

Object-C 学习笔记(三十)--- 归档(3)---对象归档

对象归档:把对象的数据归档到文件上,编程一种有结构型的文件数据,实现NSCoding协议(接口),实现归档与解档两个方法. 下面实例是一个对象归档是实例 // // User.h // def...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Object-C 学习笔记(五)---构造方法
举报原因:
原因补充:

(最多只允许输入30个字)